19 正则表达式的匹配
动态规划
思路:对于p中的一个字符而言,它只能在s中匹配一个字符,匹配的方法具有唯一性;而对于p中字符+*的组合而言,它可以在s中匹配任意个字符(包括0个),并不具有唯一性。因袭,我们可以考虑使用动态规划,对匹配方案进行枚举。
class Solution {
public boolean isMatch(String s, String p) {
int lenS = s.length();
int lenP = p.length();
boolean[][] f = new boolean[lenS+1][lenP+1];
//空正则一定不匹配
// if(lenP==0 ){
// return false;
// }
for(int i=0;i<=lenS;i++){
for (int j=0;j<=lenP;j++){
//空正则 j=0
if(j==0){
f[i][j]=i==0;//巧妙!
}
//非空正则
else{
char c;
//正则不是 *
if(p.charAt(j-1) != '*'){
if(i>0&&(p.charAt(j-1) == '.' || p.charAt(j-1) == s.charAt(i-1))){
f[i][j]=f[i-1][j-1];//
}
}else{
//正则是 *
//不看 *
if(j>=2){
f[i][j]|=f[i][j-2];
}
//看 *
if(i>=1 && j>=2 &&(s.charAt(i-1)==p.charAt(j-2)||p.charAt(j-2)=='.')){
f[i][j]= f[i][j]|f[i-1][j];
}
}
}
}
}
return f[lenS][lenP];
}
}
注:第三种情况里,分为看和不看两种,对于这两种 情况,我们都要算,当然是希望尽可能地为true,而且一种情况算出来的true不会被另一种情况算出来的false抹掉,所有用 |= ,任何一种情况算出true我们都看成true。
时间复杂度
O
(
m
n
)
O(mn)
O(mn)。其中
m
m
m和
n
n
n分别是字符串
s
s
s和
p
p
p的长度。
空间复杂度
O
(
m
n
)
O(mn)
O(mn)。因为存储状态要使用空间。