动态规划版本(从下到上):
dp[n][m]表示字符串A前n个字符和正则表达式B前m个字符是否能够匹配。
1 空正则表达式:字符串为空时为true,不为空为false。
2 非空正则表达式:需要实际情况进行计算
2.1 正则表达式B的第j位为非*:如果 A第i位与B第j位相同 或 B第j位为. ,则dp[i][j]=dp[i-1][j-1],否则dp[i][j]不变,还是false。
2.2 正则表达式B的第j位为*:
(1)不看*和其前面一位:dp[i][j]|=dp[i][j-2]
(2)看前面一位:如果 A第i位与B第j-1位相同 或B第j-1位为. ,则dp[i][j]|=dp[i-1][j],否则dp[i][j]不变,还是false
class Solution {
public boolean isMatch(String s, String p) {
int n=s.length();
int m=p.length();
boolean[][] dp=new boolean[n+1][m+1];
for(int i=0;i<=n;++i){
for(int j=0;j<=m;++j){
if(j==0){
dp[i][j]=i==0;
}else{
if(p.charAt(j-1)!='*'){
if(i>=1&&(s.charAt(i-1)==p.charAt(j-1)||p.charAt(j-1)=='.')){
dp[i][j]=dp[i-1][j-1];
}
}else{
if(j>=2){
dp[i][j]=dp[i][j-2];
}
if(i>=1&&j>=2&&(s.charAt(i-1)==p.charAt(j-2)||p.charAt(j-2)=='.')){
dp[i][j]|=dp[i-1][j];
}
}
}
}
}
return dp[n][m];
}
}
然后是递归版本(从上到下):
class Solution {
public boolean isMatch(String s, String p) {
if(s.length()==0){
if(p.length()%2==0){
for(int i=1;i<p.length();i+=2){
if(p.charAt(i)!='*'){
return false;
}
}
return true;
}
return false;
}
if(p.length()==0){
return false;
}
char a=s.charAt(0);
char b=p.charAt(0);
char c='a';
if(p.length()>1){
c=p.charAt(1);
}
if(c!='*'){
if(a==b||b=='.'){
return isMatch(s.substring(1),p.substring(1));
}
return false;
}else{
if(a==b||b=='.'){
return isMatch(s.substring(1),p)||isMatch(s,p.substring(2));
}
return isMatch(s,p.substring(2));
}
}
}