题意:有s和p两个串,p中含’*‘和’.’
.可以取代任意字符,而*可以与前一字符A(即A*)表示任意个A(包括0个)
判断s和p是否匹配。
思路:动态规划
dp[i][j]表示s[0 : i-1]与p[0 : j-1]是否匹配。
初始化:
dp[0][0]=0//空串与空串匹配
dp[0][j]=p[j-1]==’*’&&dp[0][j-2];//p[0 : j-1]是否与空串匹配
过程:分p[j-1]是否为*
在p[j-1]为*时有三种情况:(②③分别是A* 代表一个 多个A,可合为一种)
①若s[0 : i-1]与p[0 : j-3]匹配(dp[i][j-2]),则s[0 : i-1]与p[0 : j-1]匹配,即忽略A*
②③若s[0 : i-2]与p[0 : j-3]匹配,同时p[j-2]==s[i-1],则s[0 : i-1]与p[0 : j-1]匹配,即A*表示至少一个A且s[i-1]为A。
上代码:
bool isMatch(string s, string p) {
int ss = s.size(), ps = p.size();
vector<vector<bool>> dp(ss + 1, vector<bool>(ps + 1, false));
dp[0][0] = true;
for (int j = 2; j < ps + 1; ++j)
dp[0][j] = dp[0][j - 2]&&p[j - 1] == '*';
for(int i=1;i<=ss;++i)
for (int j = 1; j <= ps ; ++j) {
if (p[j - 1] != '*')
dp[i][j] = (p[j - 1] == s[i - 1] || p[j - 1] == '.') && dp[i - 1][j - 1];
else
dp[i][j] = dp[i][j - 2] || ( s[i - 1]==p[j - 2] || p[j - 2] == '.') && dp[i - 1][j];
}
return dp[ss][ps];
}