[抄题]:
Given an input string (s
) and a pattern (p
), implement regular expression matching with support for '.'
and '*'
.
'.' Matches any single character.'*' Matches zero or more of the preceding element.
The matching should cover the entire input string (not partial).
Note:
s
could be empty and contains only lowercase lettersa-z
.p
could be empty and contains only lowercase lettersa-z
, and characters like.
or*
.
Example 1:
Input:s = "aa"p = "a"Output: falseExplanation: "a" does not match the entire string "aa".
Example 2:
Input:s = "aa"p = "a*"Output: trueExplanation: '*' means zero or more of the precedeng element, 'a'. Therefore, by repeating 'a' once, it becomes "aa".
Example 3:
Input:s = "ab"p = ".*"Output: trueExplanation: ".*" means "zero or more (*) of any character (.)".
Example 4:
Input:s = "aab"p = "c*a*b"Output: trueExplanation: c can be repeated 0 times, a can be repeated 1 time. Therefore it matches "aab".
Example 5:
Input:s = "mississippi"p = "mis*is*p*."Output: false
[暴力解法]:
时间分析:
空间分析:
[优化后]:
时间分析:
空间分析:
[奇葩输出条件]:
[奇葩corner case]:
[思维问题]:
想不到是dp:最值、可行、个数
[一句话思路]:
写不出程序,就尝试只写公式
[输入量]:空: 正常情况:特大:特小:程序里处理到的特殊情况:异常情况(不合法不合理的输入):
[画图]:
[一刷]:
- 先写一般情况,再写特殊情况,别丢了
[二刷]:
- 都是从1<x <=n开始写,请看新代码
[三刷]:
[四刷]:
[五刷]:
[五分钟肉眼debug的结果]:
[总结]:
前面的不能用,后果会遗传,是这道题和wildcard匹配的区别 dp[i][j] = dp[i][j - 2];
[复杂度]:Time complexity: O(n^2) Space complexity: O(n^2)
[英文数据结构或算法,为什么不用别的数据结构或算法]:
[关键模板化代码]:
[其他解法]:
[Follow Up]:
[LC给出的题目变变变]:
[代码风格] :
class Solution { public boolean isMatch(String s, String p) { //ini:dp[][], dp[0][0], dp[0][j] boolean[][] dp = new boolean[s.length() + 1][p.length() + 1]; dp[0][0] = true; for (int j = 1; j <= p.length(); j++) { if (p.charAt(j - 1) == '*' && dp[0][j - 2] == true) dp[0][j] = true; } //for loop: 2 cases for (int i = 1; i <= s.length(); i++) { for (int j = 1; j <= p.length(); j++) { if (p.charAt(j - 1) == s.charAt(i - 1) ) { dp[i][j] = dp[i - 1][j - 1]; } if (p.charAt(j - 1) == '.') { dp[i][j] = dp[i - 1][j - 1]; } if (p.charAt(j - 1) == '*') { //*之前的不能用 if (p.charAt(j - 2) != s.charAt(i - 1) && p.charAt(j - 2) != '.') { //前面的不能用,后果会遗传 dp[i][j] = dp[i][j - 2]; }else { //匹配多个,0个,1个 dp[i][j] = dp[i - 1][j] || dp[i][j - 2] || dp[i][j - 1]; } } } } //return return dp[s.length()][p.length()]; }}