• 华为OD机考题(HJ71 字符串通配符)


    前言

    经过前期的数据结构和算法学习,开始以OD机考题作为练习题,继续加强下熟练程度。

    描述

    问题描述:在计算机中,通配符一种特殊语法,广泛应用于文件搜索、数据库、正则表达式等领域。现要求各位实现字符串通配符的算法。
    要求:
    实现如下2个通配符:
    *:匹配0个或以上的字符(注:能被*和?匹配的字符仅由英文字母和数字0到9组成,下同)
    ?:匹配1个字符

    注意:匹配时不区分大小写。

    输入:
    通配符表达式;
    一组字符串。

    输出:

    返回不区分大小写的匹配结果,匹配成功输出true,匹配失败输出false

    数据范围:字符串长度:1≤𝑠≤100 1≤s≤100 

    进阶:时间复杂度:𝑂(𝑛2) O(n2) ,空间复杂度:𝑂(𝑛) O(n) 

    输入描述:

    先输入一个带有通配符的字符串,再输入一个需要匹配的字符串

    输出描述:

    返回不区分大小写的匹配结果,匹配成功输出true,匹配失败输出false

    示例1

    输入:

    te?t*.*
    txt12.xls
    

    输出:

    false

    实现原理与步骤

    • 初始化

      • dp[0][0]表示空字符串和空模式匹配。
      • 如果模式p的字符是'*',则dp[0][j]的值取决于dp[0][j - 1],表示'*'可以匹配空字符串。
    • 填充DP数组

      • 遍历字符串s和模式p的所有字符。
      • 如果模式字符是'*',则dp[i][j]可以由两种情况决定:
        • dp[i - 1][j]'*'匹配一个或多个字符。
        • dp[i][j - 1]'*'匹配空字符串。
      • 如果模式字符是'?'或与字符串字符相等,则dp[i][j]dp[i - 1][j - 1]决定,表示这两个字符匹配。
    • 返回结果

      • 返回dp[sLen][pLen],表示字符串s和模式p的匹配结果。

    此题为难度系数为中等略有不妥,另外需注意题干中?和*只能匹配数字和英文字母。

    实现代码

    1. import java.util.Scanner;
    2. // 注意类名必须为 Main, 不要有任何 package xxx 信息
    3. public class Main {
    4. public static void main(String[] args) {
    5. Scanner in = new Scanner(System.in);
    6. // 注意 hasNext 和 hasNextLine 的区别
    7. String p = in.nextLine();
    8. String s = in.nextLine();
    9. System.out.println(isMatch(s, p)); // 输出:true 或 false
    10. }
    11. public static boolean isMatch(String s, String p) {
    12. int sLen = s.length();
    13. int pLen = p.length();
    14. // 创建一个DP数组,dp[i][j]表示s的前i个字符和p的前j个字符是否匹配
    15. boolean[][] dp = new boolean[sLen + 1][pLen + 1];
    16. // 初始化
    17. dp[0][0] = true; // 空字符串和空模式是匹配的
    18. // 初始化首行,s为空,只有p全是'*'才能匹配
    19. for (int j = 1; j <= pLen; j++) {
    20. if (p.charAt(j - 1) == '*') {
    21. dp[0][j] = dp[0][j - 1];
    22. }
    23. }
    24. // 填充DP数组
    25. for (int i = 1; i <= sLen; i++) {
    26. for (int j = 1; j <= pLen; j++) {
    27. if (p.charAt(j - 1) == '*') {
    28. // '*' 可以匹配任意字符串(包括空字符串)
    29. //if(isNumOrWord(s.charAt(i-1))){
    30. dp[i][j] = dp[i - 1][j] || dp[i][j - 1];
    31. //}
    32. } else if ((p.charAt(j - 1) == '?' && isNumOrWord(s.charAt(i - 1))) ||
    33. Character.toString(s.charAt(i - 1)).equalsIgnoreCase(Character.toString(
    34. p.charAt(j - 1)))) {
    35. // '?' 可以匹配任意一个字符
    36. dp[i][j] = dp[i - 1][j - 1];
    37. }
    38. }
    39. }
    40. return dp[sLen][pLen];
    41. }
    42. public static boolean isNumOrWord(char c) {
    43. if (c - 'a' >= 0 && c - 'a' <= 26) {
    44. return true;
    45. } else if (c - '0' >= 0 && c - '0' <= 9) {
    46. return true;
    47. }
    48. return false;
    49. }
    50. }

    1.QA:

  • 相关阅读:
    齐岳|脂质体磷酸钙纳米粒RNA核糖核酸|淫羊藿苷固体纳米脂质体(ICA-SLN)修饰负载RNA核糖核酸
    【目标检测】YOLOR理论简介+实践测试VisDrone数据集
    (六)C++中的functor与lambda
    【实践成果】Splunk 9.0 Configuration Change Tracking
    Linux命令之logrotate命令
    【Linux】命令行参数和环境变量
    python每日一题(模拟用户登录验证)
    【0233】PG内核通过PG_TRY()、PG_CATCH()、PG_END_TRY()实现异常抛出、捕获
    java毕业生设计校园食堂订餐系统计算机源码+系统+mysql+调试部署+lw
    vue 表单重置功能
  • 原文地址:https://blog.csdn.net/acuteeagle01/article/details/140284184