10. 正则表达式匹配
如果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]是真;
s[i]可以和p[j]匹配,且f[i+1] [j]是真;
class Solution {
public:
vector<vector<int>> dp;
int lens, lenp;
bool isMatch(string s, string p) {
lens = s.size();
lenp = p.size();
dp = vector<vector<int>>(lens + 1, vector<int>(lenp + 1, -1));
return sol(s, p, 0, 0);
}
bool sol(string &s, string &p, int x, int y) {
if(dp[x][y] != -1) return dp[x][y];
if(y == lenp) return dp[x][y] = x == lens;
bool match = (s[x] == p[y] || p[y] == '.') && x < lens;// 越界
bool tmp;
if(p[y + 1] == '*' && y + 1 < lenp) {
tmp = ( (match && sol(s, p, x + 1, y) ) || sol(s, p, x, y + 2));// 多匹配||0匹配
} else {
tmp = match && sol(s, p, x + 1, y + 1);
}
return tmp;
}
};
72. 编辑距离
状态表示:f[i,j] 表示将 word1 的前 i 个字符变成 word2 的前 j 个字符,最少需要进行多少次操作。
状态转移,一共有四种情况:
- 将 word1[i]删除或在 word2[j]后面添加 word1[i],则其操作次数等于 f[i−1,j]+1;
- 将 word2[j]删除或在 word1[i]后面添加 word2[j],则其操作次数等于 f[i,j−1]+1;
- 如果 word1[i]=word2[j],则其操作次数等于 f[i−1,j−1];
- 如果 word1[i]≠word2[j],则其操作次数等于 f[i−1,j−1]+1;
时间复杂度分析:状态数 O(n2),状态转移复杂度是 O(1),所以总时间复杂度是 O(n2);
class Solution {
public:
vector<vector<int>> dp;
int len1, len2;
int minDistance(string word1, string word2) {
len1 = word1.size(), len2 = word2.size();
dp = vector<vector<int>>(len1 + 1, vector<int>(len2 + 1));
for(int i = 0; i <= len1; i ++) dp[i][0] = i;
for(int i = 0; i <= len2; i ++) dp[0][i] = i;
for(int i = 1; i <= len1; i ++) {
for(int j = 1; j <= len2; j ++) {
if(word1[i - 1] != word2[j - 1]) {
dp[i][j] = dp[i - 1][j - 1] + 1;
} else {
dp[i][j] = dp[i - 1][j - 1];
}
dp[i][j] = min(dp[i - 1][j] + 1, dp[i][j]);
dp[i][j] = min(dp[i][j - 1] + 1, dp[i][j]);
}
}
return dp[len1][len2];
}
};
大概率 持续更新。。。。。。。。 待续