class Solution {
public:
/*
dp[i][j]:以string[i-1]结尾的字符串和以string[j-1]结尾的字符串相等字符的个数
"" a h b g d c
"" 0 0 0 0 0 0 0
a 0 1 1 1 1 1 1
b 0 0 1 2 2 2 2
c 0 0 0 0 0 0 3
如果当前字符串(string s)里的字符与目标字符串(string t)里的字符对应相等:
if(s[i-1]==t[j-1]) dp[i][j]=dp[i-1][j-1]+1;
如果字符对应不相等,就应该去看目标字符串里之前的字符与当前字符串里的字符相不相等
else dp[i][j]=dp[i-1][j];
*/
bool isSubsequence(string s, string t) {
int m=s.size();
int n=t.size();
vector<vector<int>>dp(m+1,vector<int>(n+1,0));
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
if(s[i-1]==t[j-1]){
dp[i][j]=dp[i-1][j-1]+1;
}
else{
dp[i][j]=dp[i][j-1];
}
}
}
//如果dp[m][n]等于当前字符串长度,就是目标字符串的子序列
if(dp[m][n]==m) return true;
else return false;
}
};
class Solution {
public:
int minDistance(string word1, string word2) {
/*删除到最后的结果就是最长公共子序列!!!
dp[i][j]:以word[i-1]结尾的字符串与以word[j-1]结尾的字符串的lsc的长度
"" s e a
"" 0 0 0 0
e 0 0 1 1
a 0 0 1 2
t 0 0 1 2
题目要求的是最小删除次数:只需要拿每个字符串长度都减去lsc的长度得到删除的总次数最小值
res=m-dp[m][n]+n-dp[m][n];
*/
int m=word1.size();
int n=word2.size();
vector<vector<int>>dp(m+1,vector<int>(n+1,0));
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
if(word1[i-1]==word2[j-1]) dp[i][j]=dp[i-1][j-1]+1;
else dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
}
}
int res=0;
res=m+n-2*dp[m][n];
return res;
}
};