• 华为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:

  • 相关阅读:
    scratch绘制小太阳 2023年9月电子学会图形化编程scratch编程等级考试二级真题和答案解析
    电脑在开机时出现了bootmenu
    微信小程序 23 播放音乐页
    淘宝店铺上新图片上传获取请求方法
    mybatis中使用@Column(name = “`group`“)失效
    JavaScript学习笔记之二(DOM API)
    MySQL主从复制&读写分离
    如何自己开传奇单机架设超详细图文教程
    绕过防盗链的几种方式
    黑马JVM总结(二)
  • 原文地址:https://blog.csdn.net/acuteeagle01/article/details/140284184