正则表达式:link
1.题目分析
1.题目中是要s与p匹配,应该会想到动态规划,然后就是确定初始条件和怎样从前往后推。
- 初始条件,前一个对一个不好处理的话,可以想下零个对零个的情况。
- 递推分析
case1 if(s[i] == p[j] || p[j]) == '.') dp[i][j] = dp[i - 1][j - 1]; case2 //有两种子情况 if(p[j - 1] != s[i] && p[j - 1) != '.') //此时只能选择把p[i]前面的那个消掉 dp[i][j] = dp[i][j - 2] else dp[i][j] = dp[i][j-2] //a* as empty || dp[i ][j - 1] // as single || dp[i - 1][j] // as multiple
2.示例代码
class Solution {
public:
bool isMatch(string s, string p) {
int s_len = s.length();
int p_len = p.length();
//dp[i][j] 代表s的前i个是否可以和p的前j个匹配
vector<vector<bool>> dp(s_len + 1, vector<bool>(p_len + 1, false));
dp[0][0] = true; //空s 与 空p是可以匹配的
//其余dp[i][0]为false, 空p是无法匹配非空字符串的
for(int j = 0; j < p.length(); ++j){
if(p[j] == '*')
dp[0][j + 1] = dp[0][j-1]; //前j + 1个才会包含p[j]
}
for(int i = 0; i < s_len; ++i){
for(int j = 0; j < p_len; ++j){
if(s[i] == p[j] || p[j] == '.'){
dp[i + 1][j + 1] = dp[i][j];
}else if(p[j] == '*'){
if(p[j - 1] != s[i] && p[j - 1] != '.'){
dp[i + 1][j + 1] = dp[i + 1][j - 1];
}else{
dp[i + 1][j + 1] = (dp[i + 1][j - 1] || dp[i + 1][j] || dp[i][j + 1]);
}
}
}
}
return dp[s_len][p_len];
}
};