44. Wildcard Matching 有简写的字符串匹配

[抄题]:

Given an input string (s) and a pattern (p), implement wildcard pattern matching with support for '?' and '*'.

'?' Matches any single character.
'*' Matches any sequence of characters (including the empty sequence).

The matching should cover the entire input string (not partial).

Note:

  • s could be empty and contains only lowercase letters a-z.
  • p could be empty and contains only lowercase letters a-z, and characters like ? or *.

Example 1:

Input:
s = "aa"
p = "a"
Output: false
Explanation: "a" does not match the entire string "aa".

Example 2:

Input:
s = "aa"
p = "*"
Output: true
Explanation: '*' matches any sequence.

Example 3:

Input:
s = "cb"
p = "?a"
Output: false
Explanation: '?' matches 'c', but the second letter is 'a', which does not match 'b'.

Example 4:

Input:
s = "adceb"
p = "*a*b"
Output: true
Explanation: The first '*' matches the empty sequence, while the second '*' matches the substring "dce".

Example 5:

Input:
s = "acdcb"
p = "a*c?b"
Output: false

 [暴力解法]:

时间分析:

空间分析:

 [优化后]:

时间分析:

空间分析:

[奇葩输出条件]:

[奇葩corner case]:

初始化dp[0][j]的时候,除开一直是*的情况,都不能随意匹配 

[思维问题]:

搞不清楚和第十题的区别:就是能不能遗传 dp[i][j] = dp[i][j - 2]就行了

[英文数据结构或算法,为什么不用别的数据结构或算法]:

[一句话思路]:

[输入量]:空: 正常情况:特大:特小:程序里处理到的特殊情况:异常情况(不合法不合理的输入):

[画图]:

[一刷]:

  1. dp[i][j - 1] 是重复一个字符的情况(其中包括了空字符),所以空字符不需要单独列出来

[二刷]:

[三刷]:

[四刷]:

[五刷]:

  [五分钟肉眼debug的结果]:

[总结]:

  1. dp[i][j - 1] 是重复一个字符的情况(其中包括了空字符),所以空字符不需要单独列出来

[复杂度]:Time complexity: O(mn) Space complexity: O(mn)

[算法思想:递归/分治/贪心]:贪心

[关键模板化代码]:

for (int i = 1; i <= m; i++) {
            dp[i][0] = false;
        }
        
        for (int j = 1; j <= n; j++) {
            if (p.charAt(j - 1) == '*') dp[0][j] = true;
            else break;
        }

[其他解法]:

[Follow Up]:

[LC给出的题目变变变]:

10有前序的

 [代码风格] :

 [是否头一次写此类driver funcion的代码] :

class Solution {
    public boolean isMatch(String s, String p) {
        //ini: dp[][]
        int m = s.length();
        int n = p.length();
        boolean[][] dp = new boolean[m + 1][n + 1];
        
        //cc: dp[0][0], dp[0][], dp[][0]
        dp[0][0] = true;
        
        for (int i = 1; i <= m; i++) {
            dp[i][0] = false;
        }
        
        for (int j = 1; j <= n; j++) {
            if (p.charAt(j - 1) == '*') dp[0][j] = true;
            else break;
        }
        
        //for loop: not * must equal or ., * 0 or more
        for (int i = 1; i <= m; i++) {
            for (int j = 1; j <= n; j++) 
                if (p.charAt(j - 1) != '*') {
                    //1s
                    dp[i][j] = dp[i - 1][j - 1] && (s.charAt(i - 1) == p.charAt(j - 1) || p.charAt(j - 1) == '?');
                }else {
                    //multiple s, 0 s
                    dp[i][j] = dp[i - 1][j] || dp[i][j - 1];
                }
        }
        
        //return m n
        return  dp[m][n];
    }
}
View Code

 

posted @ 2018-05-24 10:08  苗妙苗  阅读(202)  评论(0)    收藏  举报