• 44. 通配符匹配


    题目描述查看:https://leetcode-cn.com/problems/wildcard-matching/

      题目的意思是给一个字符串s,给一个模式串p,要看p和s匹不匹配。模式串里可以出现'?',匹配一个任意字符;可以出现'*',匹配0个或多个任意字符。

    • 思路

    创建一个数组dp[i][j]用来保存模式串p中的前i个字符和字符串s中的前j个字符匹不匹配。

    dp[0][0]表示p中0个字符和s中0个字符匹不匹配,显然匹配。

    dp[0][0] = true;

    dp[0][i]表示p中0个字符和s中[1,s.length]之间个字符匹不匹配,显然不可能匹配。

    dp[i][0]表示p中[1,p.length]个字符和s中0个字符匹不匹配,这要看p中第i个字符是不是'*',这里的'*'表示空字符,'*'表示空字符的话,就看p中前一个字符和s匹不匹配。

            for (int i = 1; i <= p.length(); i++) {
                if(p.charAt(i-1) == '*')dp[i][0] = dp[i-1][0];
            }

    处理完初始条件后,看之后的字符匹不匹配。

    当p[i]是'?'或者p[i]==s[j]时候,就看p[0,i-1]和s[0,j-1]匹不匹配。

    if(p.charAt(i-1) == '?' || p.charAt(i-1) == s.charAt(j-1))
                        dp[i][j] = dp[i-1][j-1];

    当p[i]是'*',要看'*'表示的是空字符,还是多个字符。

    '*'表示空字符,那么看p[0,i-1]和s[0,j]匹不匹配。如:p=ab*,s=ab,p[0,1]=ab和s[0,1]匹配,'*'匹配0个字符。

    '*'表示多个字符,那么看p[0,i]和s[0,j-1]匹不匹配。如:p=ab*,s=abcd。

     else if(p.charAt(i-1) == '*'){
                        dp[i][j] = dp[i][j-1] || dp[i-1][j];
                    }
    • 代码

     1     public boolean isMatch(String s, String p) {
     2         boolean[][] dp = new boolean[p.length()+1][s.length()+1];
     3         dp[0][0] = true;
     4         for (int i = 1; i <= p.length(); i++) {
     5             if(p.charAt(i-1) == '*')dp[i][0] = dp[i-1][0];
     6         }
     7 
     8         for (int i = 1; i <= p.length() ; i++) {
     9             for (int j = 1; j <= s.length(); j++) {
    10                 if(p.charAt(i-1) == '?' || p.charAt(i-1) == s.charAt(j-1))
    11                     dp[i][j] = dp[i-1][j-1];
    12                 else if(p.charAt(i-1) == '*'){
    13                     dp[i][j] = dp[i][j-1] || dp[i-1][j];
    14                 }
    15             }
    16         }
    17         return dp[p.length()][s.length()];
    18     }
  • 相关阅读:
    接收短信
    linux 中统计相同序列出现的次数
    linux 中 vmware如何扩展磁盘大小
    pindel软件的基本用法
    如何解决vim 编辑器注释行后面字符开不清
    linux中basename命令
    linux 中 利用命令向文件的末尾添加空行
    普通用户调整vim编辑器配置
    利用samtools软件将sam文件转换为bam文件
    linux 中 date +%s 获取1970年以来的秒数
  • 原文地址:https://www.cnblogs.com/vshen999/p/12630626.html
Copyright © 2020-2023  润新知