LC.44. 通配符匹配(DP)
思路:。这里根据题解再梳理一遍。
显然可以令为前个字符和前个字符是否匹配。
首先我们考虑状态转移方程。
1.显然当或者可以直接由转移过来
即:.
2.如果,显然可以由转移过来。
即对应是否为空串,若是空串直接由转移。
否则不是空串,因为可变为任意字符串所以必能由转移。
其他情况都不能转移。
再考虑边界情况,显然
,需要考虑前个字符是否都为,若出现或字母则。
时间复杂度:
class Solution {
public:
bool isMatch(string s, string p) {
int m=s.size(),n=p.size();
vector<vector<bool> >dp(m+1,vector<bool>(n+1));
dp[0][0]=1;
for(int i=1;i<=n;i++)
if(p[i-1]=='*') dp[0][i]=1;
else break;
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++)
if(s[i-1]==p[j-1]||p[j-1]=='?') dp[i][j]=dp[i-1][j-1];
else if(p[j-1]=='*') dp[i][j]=dp[i-1][j]|dp[i][j-1];
return dp[m][n];
}
};
自动机知识待补