标签:等价 distance 额外 一个 span cto 增加 bsp turn
典型DP题,思路上和 LCS 很像。
dp[i][j] 表示word1前i个 word2前j个 所需的最小操作数。
base case: dp[i][0]=i, dp[0][j]=j. 需要额外注意这里的base case。
dp[i][j] = dp[i-1][j-1] if word1[i-1]==word2[j-1]
min{ dp[i-1][j-1], dp[i-1][j], dp[i][j-1] } + 1 o/w
不相等的时候 dp[i-1][j-1]+1 表示把不相等的replace一下,dp[i-1][j]+1 表示把word1减少一个字符,dp[i][j-1]+1 表示把word2减少一个字符。(增加一个字符和减少一个字符是等价的)
class Solution { public: int minDistance(string word1, string word2) { vector<vector<int>> dp(word1.size()+1,vector<int>(word2.size()+1,0)); for (int i=1;i<=word1.size();++i) dp[i][0]=i; for (int j=1;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], min(dp[i-1][j], dp[i][j-1])) + 1; } } return dp[word1.size()][word2.size()]; } };
标签:等价 distance 额外 一个 span cto 增加 bsp turn
原文地址:https://www.cnblogs.com/hankunyan/p/10041450.html