https://leetcode.com/problems/regular-expression-matching/
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).
The function prototype should be:
bool isMatch(const char *s, const char *p)
Some examples:
isMatch("aa","a") → false
isMatch("aa","aa") → true
isMatch("aaa","aa") → false
isMatch("aa", "a*") → true
isMatch("aa", ".*") → true
isMatch("ab", ".*") → true
isMatch("aab", "c*a*b") → true
这道题跟wildcard matching一样,也是用DP做就行了。
重点思路一定要清楚,调试了好多遍才过,主要是下标太乱了。。。。
public class Solution {
public boolean isMatch(String s, String p) {
if(s.length()==0 && p.length()==0)
return true;
if(p.length()==0)
return false;
boolean[][] res = new boolean[s.length()+1][p.length()+1];
res[0][0] = true;
for(int j=0;j<=p.length();j++)
{
if(j==0) continue; //only res[0][0] = true, other res[i][0]=false;
if(p.charAt(j-1)=='*'){
res[0][j] = res[0][j-2];
for(int i=0; i<=s.length(); i++){
if(res[i][j-2]){
res[i][j]=true;
i++;
while(i<=s.length() && (s.charAt(i-1)==p.charAt(j-2)||p.charAt(j-2)=='.')){
res[i][j]=true;
i++;
}
i--;
}
}
}
else{
res[0][j]=false;
for(int i=1; i<=s.length(); i++){
if((p.charAt(j-1)==s.charAt(i-1) || p.charAt(j-1)=='.')&& res[i-1][j-1]) res[i][j]=true;
}
}
}
return res[s.length()][p.length()];
}
}
这道题代码得多写几遍,直到写熟为止。。。。。