以前做的题,现在又忘了,哎,为了找工作,这个东西就得不断练啊。不过发现需要递归来解决的问题,用动态规划时一种很好的思路
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: false Explanation: "a" does not match the entire string "aa".
Example 2:
Input: s = "aa" p = "a*" Output: true Explanation: '*' means zero or more of the precedeng element, 'a'. Therefore, by repeating 'a' once, it becomes "aa".
Example 3:
Input: s = "ab" p = ".*" Output: true Explanation: ".*" means "zero or more (*) of any character (.)".
Example 4:
Input: s = "aab" p = "c*a*b" Output: true Explanation: 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
solution:(打败98%点多,时间复杂度嘛O(m*n))
class Solution {
public boolean isMatch(String s, String p) {
int slen = s.length(),plen=p.length();
//dp[i][j],i表示s取长,j表示p取长
boolean [][] dp= new boolean[slen+1][plen+1];
//两者都为0时,为true
dp[0][0]=true;
//s不为空,p为空
for(int sOfDp=1;sOfDp<=slen;sOfDp++){
dp[sOfDp][0] = false;
}
//s为空,只有形如a*b*才可以生效
for(int pOfDp=1;pOfDp<=plen;pOfDp++){
if(p.charAt(pOfDp-1)=='*')
dp[0][pOfDp] = dp[0][pOfDp-2];
else
dp[0][pOfDp] = false;
}
for(int sOfDp=1;sOfDp<=slen;sOfDp++){
for(int pOfDp=1;pOfDp<=plen;pOfDp++){
//s与p的最后一个字母相同
if(p.charAt(pOfDp-1)=='.'||p.charAt(pOfDp-1)==s.charAt(sOfDp-1)){
dp[sOfDp][pOfDp]= dp[sOfDp-1][pOfDp-1];
}else if(p.charAt(pOfDp-1)!='*') {
//不同且不为 *
dp[sOfDp][pOfDp]=false;
}else {
//s当前字母与p的前一个字母相同,则向前放缩,放缩应尽量小
//形如aaa,a*,比较aa,a*,比较a,a*,比较 空,a* 返回
if(p.charAt(pOfDp-2)=='.'||p.charAt(pOfDp-2)==s.charAt(sOfDp-1)){
dp[sOfDp][pOfDp]=dp[sOfDp-1][pOfDp]||dp[sOfDp][pOfDp-2];
}else{
//形如 a ,ab*,比较 a ,a
dp[sOfDp][pOfDp]=dp[sOfDp][pOfDp-2];
}
}
}
}
return dp[slen][plen];
}
}