思路:删除操作其实就是选或者不选的问题,如果该位置两个字符串相等,则都可以选,不用删除。如果不相等的时候,则要讨论三种情况,1.删除t中的字符,不删除s中的字符;2.不删除t中的字符,删除s中的字符;3.两个字符串中的字符都删除!但是
dp[i-1][j]+1
,本来就没有考虑word1[i-1],只考虑word2[j-1]的,故只需要删除一个就行了,另外一个同理!
class Solution {
public:
int minDistance(string word1, string word2) {
vector<vector<int>> dp(word1.size()+1,vector<int>(word2.size()+1));
for(int i=0;i<=word1.size();i++)dp[i][0]=i;
for(int j=0;j<=word2.size();j++)dp[0][j]=j;
for(int i=1;i<=word1.size();i++)
{
for(int j=1;j<=word2.size();j++)
{
if(word1[i-1]==word2[j-1])
{
dp[i][j]=dp[i-1][j-1];
}
else
{
dp[i][j]=min(dp[i-1][j]+1,dp[i][j-1]+1);
}
}
}
return dp[word1.size()][word2.size()];
}
};
思路:最开始一脸懵逼,因为有什么插入,替换操作,不知道怎么解!
class Solution {
public:
int minDistance(string word1, string word2) {
vector<vector<int>> dp(word1.size()+1,vector<int>(word2.size()+1));
for(int i=0;i<=word1.size();i++)dp[i][0]=i;
for(int j=0;j<=word2.size();j++)dp[0][j]=j;
for(int i=1;i<=word1.size();i++)
{
for(int j=1;j<=word2.size();j++)
{
if(word1[i-1]==word2[j-1])
{
dp[i][j]=dp[i-1][j-1];
}
else
{
dp[i][j]=min({dp[i-1][j],dp[i][j-1],dp[i-1][j-1]})+1;
}
}
}
return dp[word1.size()][word2.size()];
}
};