此题利用动态规划,建立一个二维数组
match_flag[i][j]表示s串的前i字符与p串的前j个字符是否匹配;
然后迭代求解match_flag[s.length()][p.length()]即得到最终解;
class Solution {
public:
bool isMatch(string s, string p) {
vector<vector<bool> > match_flag(s.length() + 1,vector<bool>(p.length() + 1,false));
match_flag[0][0] = true;
for(int i = 0;i <= s.length();i++)
for(int j = 1;j <= p.length();j++)
{
if(i == 0)
{
if(p[j - 1] == '*')
match_flag[i][j] = match_flag[i][j - 2]; //对于i==0要特殊处理,防止段错误
}
else
{
if(p[j - 1] == '.'||(p[j - 1] == s[i - 1]))
match_flag[i][j] = match_flag[i - 1][j - 1]; //p串不是*号字符
else
{
if(p[j - 1] == '*') //p串为*号,则依次匹配前面的字符
{
char tmp = p[j - 2];
int k = i - 1;
bool flag = false;
match_flag[i][j] = match_flag[i][j - 2]; // *号匹配前面字符 0次
if(match_flag[i][j])
continue;
while(k >= 0)
{
if(s[k] == tmp||tmp == '.') // 若*号前面字符一直与s串的字符相等,则依次向前推动寻找是否匹配
{
flag = match_flag[k][j - 2];
if(flag)
{
match_flag[i][j] = true; //一旦找到就可以停止
break;
}
--k;
}
else
break;
}
}
}
}
}
return match_flag[s.length()][p.length()];
}
};