使用动态规划解决正则表达式匹配问题
class Solution {
public:
bool isMatch(string& s, string& p) {
//递归
return helper(s,0,p,0);
}
bool helper(string &s,int i,string &p,int j)
{
//base case
if(s[i]=='\0' && p[j]=='\0')
return true;
// 模式结束
if(s[i]!='\0' && p[j]=='\0')
return false;
if(p[j+1]=='*')
{
//匹配 有三种情况
//1.*匹配一次 一起移动
//*匹配多次,模式p不动,字符串向后移动匹配
//*匹配0次 忽略*
if(p[j]==s[i] || p[j]=='.'&&s[i]!='\0')
{
return helper(s,i+1,p,j+2)
|| helper(s,i+1,p,j)
|| helper(s,i,p,j+2); //跳过*继续匹配
}
else //继续向后 且跳过*
{
return helper(s,i,p,j+2);
}
}
//p的下一个不是* 且匹配
if(p[j]==s[i] || p[j]=='.'&&s[i]!='\0')
{
return helper(s,i+1,p,j+1);
}
return false;
}
};