题意
给定两个字符串,用后面的串去匹配前面的串,问能不能匹配成功。
第二个串中‘.’可以表示任意字符,‘*’表示前一个字符可以出现任意次(包括0次)
题解
用记忆化搜索来做,dp[i][j]表示s的后i个字符能不能和p的后j个字符匹配。
然后分情况搜索来就行了。
代码
int dp[2000][2000];
class Solution {
public:
bool judge(string s, string p) {
if (dp[s.size()][p.size()] != -1) {
return dp[s.size()][p.size()];
}
if (s != "" && p == "") {
return false;
}
if (s == "" && p == "") {
return true;
}
bool ans;
if (p[0] == '.') {
if (p.size() > 1 && p[1] == '*') {
if (s.size() > 0) {
ans = judge(s.substr(1, s.size() - 1), p) || judge(s.substr(1, s.size() - 1), p.substr(2, p.size() - 2)) || judge(s, p.substr(2, p.size() - 2));
}
else {
ans = judge(s, p.substr(2, p.size() - 2));
}
}
else {
if (s.size() > 0) {
ans = judge(s.substr(1, s.size() - 1), p.substr(1, p.size() - 1));
}
else {
ans = false;
}
}
}
else {
if (s[0] == p[0]) {
if (p.size() > 1 && p[1] == '*') {
if (s.size() > 0) {
ans = judge(s.substr(1, s.size() - 1), p) || judge(s.substr(1, s.size() - 1), p.substr(2, p.size() - 2)) || judge(s, p.substr(2, p.size() - 2));
}
else {
ans = judge(s, p.substr(2, p.size() - 2));
}
}
else {
if (s.size() > 0) {
ans = judge(s.substr(1, s.size() - 1), p.substr(1, p.size() - 1));
}
else {
ans = false;
}
}
}
else {
if (p.size() > 1 && p[1] == '*') {
ans = judge(s, p.substr(2, p.size() - 2));
}
else {
ans = false;
}
}
}
return dp[s.size()][p.size()] = ans;
}
bool isMatch(string s, string p) {
memset(dp, -1, sizeof(dp));
/*string temp = "";
int pos = 0;
while (pos < p.size()) {
if (pos + 3 < p.size() && (p.substr(pos, 2) == p.substr(pos + 2, 2)) && p[pos+1] == '*') {
pos += 2;
}
else if (pos + 3 < p.size() && (p[pos] == '.' || p[pos + 2] == '.') && p[pos + 1] == '*'&& p[pos + 3] == '*') {
p[pos + 2] = '.';
pos += 2;
}
else {
temp += p[pos++];
}
}
return judge(s, temp);*/
return judge(s, p);
}
};