这题是p串匹配s串。其中p串含有'?'(能匹配任一个字符),'*'能匹配任意字符串包括空串。 使用动态规划:f[i][j]表示s串前i个字符匹配p串前j个字符的结果。分为三种情况:

  • p串第j个字符串既不是'?',也不是'*',那么当s串第i个字符与p串第j个字符相同时,f[i][j]取决于f[i-1][j-1]
  • p串第j个字符是'?',那么能匹配s[i],f[i][j]同样取决于f[i-1][j-1]
  • p串第j个字符是'*'
    • 当'*'匹配空串时,f[i][j]取决于f[i][j-1],这个很直观
    • 当'*'匹配非空串时,f[i][j]取决于f[i-1][j] ,因为此时'*'表示多个字符,需要保持'*'不动,那么s串第i个字符以及后面的字符串f[i~][j]都取决于f[i-1][j],当f[i-1][j]为true可以匹配时,那么f[i~][j]都为true,都可以匹配。
  • 本题还需要注意初始化,即f[0][0]为true,此外当p串前面连续子串都是*时,f[0][j]都是true
public class Solution {
    public boolean isMatch(String s, String p) {
        int n = s.length(), m = p.length();
        boolean[][] f = new boolean[n+1][m+1];
        f[0][0] = true;
        for(int i = 1;i <= m;i++) {
            if(p.charAt(i-1) == '*') {
                f[0][i] = true;
            } else {
                break;
            }
        }
        for(int i = 1;i <= n;i++) {
            for(int j = 1;j <= m;j++) {
                if(p.charAt(j-1) == '*') {
                    f[i][j] = f[i-1][j] || f[i][j-1];
                } else if(s.charAt(i-1) == p.charAt(j-1) || p.charAt(j-1) == '?') {
                    f[i][j] = f[i-1][j-1];
                }
            }
        }
        return f[n][m];
    }
}