正则表达式匹配(思维dp)
dp[i][j]数组含义:s串前i个字符和p串前j个字符是否匹配
转移方程:
f[i][j]==true
一、
p[j+1]=='.' --> f[i+1][j+1] = true
二、
p[j+1]==['a'-'z'] --> f[i+1][j+1] = p[j+1] == s[i+1]
三、
p[j+2]=='*' --> *取0 f[i][j+2] = true //['a'-'z']* 或者 .*不存在
四、
p[j+1]=='*' --> *取1 f[i][j+1] = true
--> *取>1 f[i+1][j] = p[j]==s[i] //可以理解为p串中的*消除了s串中的字符,这样会好理解一点
Code:
class Solution {
public:
bool f[22][33];
bool isMatch(string s, string p) {
int n = s.size(),m = p.size();
f[0][0] = true;
for(int i=0;i<=n;i++) {
for(int j=0;j<m;j++) {
if(f[i][j]) {
//因为字符串下标从零开始,所以看起来有点别扭
if(p[j]=='.') f[i+1][j+1] = 1;
if(p[j]>='a'&&p[j]<='z'&&p[j]==s[i]) f[i+1][j+1] = 1;
if(p[j+1]=='*') f[i][j+2] = 1; //*不用
if(p[j]=='*') {
f[i][j+1] = 1;
if(p[j-1]=='.') f[i+1][j] = 1;
if(p[j-1]>='a'&&p[j-1]<='z'&&p[j-1]==s[i])
f[i+1][j] = 1;
}
}
}
}
return f[n][m];
}
};
弱鸡的自我修炼QAQ