正则表达式笔试题,正则表达式选择题答案
请实现一个函数来匹配正则表达式,包括“.”和“*”。
字符“.”在模式中表示任何字符,而 * 表示它之前的字符可以出现任意次(包括0次)。
在本主题中,匹配意味着字符串的所有字符都匹配整个模式。
例如,字符串“aaa”匹配模式“a.a”和“ab*ac*a”,但不匹配“aa.a”或“ab*a”。
样品
输入:
s=aa
p=a*
输出:真实思维(动态编程)
状态:f[i][j]表示P从J开始到末端,是否能匹配S从I到末端。
状态转换:
如果p[j 1]不是通配符 * ,那么f[i][j]为真当且仅当s[i]能匹配p[j]且f[i 1][j 1]为真;如果p[j 1]是通配符 * ,那么只要有下列条件之一,f[i][j]就为真;F[i][j 2]为真;这意味着0 p[j] s[i]可以匹配p[j],f[i 1][j]为真;第一种情况的状态转换很好理解,但是第二种情况的状态转换呢?
最直观的转移方式如下:枚举通配符 * 可以匹配多少个p[j],只要有一种情况可以匹配,那么f[i][j]为真;
这样我们发现f[i][j]枚举0 p[j],其他所有枚举都包含在f[i 1][j]中,所以我们只需要判断
f[i 1][j]是否为真,s[i]是否能匹配p[j]。
时间复杂度分析:表示的长度,p的长度,总状态,状态转换复杂度,所以总时间复杂度为。
代码类解决方案{
公共:
vector vector int f;
int n,m;
bool isMatch(字符串s,字符串p) {
n=s . size();
m=p . size();
f=向量向量int(n ^ 1,向量int(m ^ 1,-1));
返回dp(0,0,s,p);
}
bool dp(int x,int y,string s,string p)
{
if (f[x][y]!=-1)返回f[x][y];
如果(y==m)
返回f[x][y]=x==n;
bool first _ match=x n(s[x]==p[y] p[y]==。);
布尔ans
if (y 1 m p[y 1]==* )
{
ans=dp(x,y ^ 2,s,p) first _ match DP(x ^ 1,y,s,p);
}
其他
ans=first_match dp(x 1,y 1,s,p);
返回f[x][y]=ans;
}
};
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。