Leetcode392. 判断子序列
class Solution {
public:
bool isSubsequence(string s, string t) {
int k = 0;
for (auto c : t)
if (k < s.size() && c == s[k])
k ++ ;
return k == s.size();
}
};
Leetcode1143. 最长公共子序列
class Solution {
public:
int longestCommonSubsequence(string s1, string s2) {
int n = s1.size(), m = s2.size();
s1 = ' ' + s1;
s2 = ' ' + s2;
vector<vector<int>> f(n + 1, vector<int>(m + 1));
for (int i = 1; i <= n; i ++ )
for (int j = 1; j <= m; j ++ )
{
f[i][j] = max(f[i - 1][j], f[i][j - 1]);
if (s1[i] == s2[j])
f[i][j] = max(f[i][j], f[i - 1][j - 1] + 1);
}
return f[n][m];
}
};
Leetcode72. 编辑距离
class Solution {
public:
int minDistance(string s1, string s2) {
int n = s1.size(), m = s2.size();
s1 = ' ' + s1;
s2 = ' ' + s2;
vector<vector<int>> f(n + 1, vector<int>(m + 1));
for (int j = 0; j <= m; j ++ ) f[0][j] = j;
for (int i = 1; i <= n; i ++ ) f[i][0] = i;
for (int i = 1; i <= n; i ++ )
for (int j = 1; j <= m; j ++ ) {
f[i][j] = min(f[i - 1][j], f[i][j - 1]) + 1;
int t = s1[i] != s2[j];
f[i][j] = min(f[i][j], f[i - 1][j - 1] + t);
}
return f[n][m];
}
};