$$ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Self-defined math definitions %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Math symbol commands \newcommand{\intd}{\,{\rm d}} % Symbol 'd' used in integration, such as 'dx' \newcommand{\diff}{{\rm d}} % Symbol 'd' used in differentiation ... $$

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     }

 

posted @ 2020-04-04 10:24  V丶vvv  阅读(318)  评论(0编辑  收藏  举报