动态规划
bool dp[100000];
bool rp[100000];
class Solution {
public:
bool isMatch(string s, string p) {
int m=p.size(),n=s.size();
int i,j;
memset(dp, 0, sizeof(dp));
memset(rp,0,sizeof(rp));
dp[0]=1;
for(i=1;i<=m;i++)
{
if(p[i-1]=='*')
rp[0]=dp[0];
for(j=1;j<=n;j++)
{
if(p[i-1]=='?')
{
if(dp[j-1])
rp[j]=true;
}
else if(p[i-1]=='*')
{
if(dp[j-1]||dp[j]||rp[j-1])
rp[j]=true;
}
else
{
if(dp[j-1]&&p[i-1]==s[j-1])
rp[j]=true;
}
}
for(j=0;j<=n;j++)
dp[j]=rp[j];
memset(rp,0,sizeof(rp));
}
return dp[n];
}
};
方法2:
迭代回溯
class Solution {
public:
bool isMatch(string s, string p) {
int n=s.size();
int m=p.size();
int i=0,j=0,k=-1,t=-1;
while(s[i]!='\0')
{
if(s[i]==p[j]||p[j]=='?')
i++,j++;
else if(p[j]=='*')
t=i,k=j++;
else if(k!=-1)
{
i=++t;
j=k+1;
}
else
return false;
}
while(j<m&&p[j]=='*')
j++;
return j>=m;
}
};

本文介绍了两种实现正则表达式匹配的算法:一种利用动态规划的方法,通过两个布尔数组来记录状态转移;另一种采用迭代回溯的方式,适用于更简单的情况。这两种方法均可用于判断字符串是否符合给定的模式。
436

被折叠的 条评论
为什么被折叠?



