題意:兩個字符串的編輯距離就是使兩個字符串變得一樣的操作數,做操包括插入刪除替換。
分析與思路:這道題是一道典型的動態規劃題目,類似這種兩個字符串的動態規劃,一般都需要一個二維數組維護dp值。這裏我用dp[i][j]表示第一個字符串的前i個字符前綴和第二個字符串的前j個前綴之間的最小編輯距離值。第一個字符串長度m,第二個字符串長度n,這樣我們的目標就是dp[m][n],爲了把問題簡單化,每次減少一個字符的比較。還有要維護一層外圍邊界作爲某個字符串長度爲0時的邊界情況:dp[0][.]=0,dp[.][0]=0;所以狀態轉移方程爲:i>0&&j>0時,dp[i][j]=min{dp[i][j-1]+1,dp[i-1][j]+1,dp[i-1][j-1]+dis},dis=str1[i]==str2[j]?0:1;
代碼:
class Solution {
public:
int minDistance(string word1, string word2) {
int m = word1.length(), n = word2.length();
vector<vector<int>> dp(m+1,vector<int>(n+1,9999));
for (int i = 0; i < m+1; i++) {
dp[i][0] = i;
}
for (int i = 0; i < n+1; i++) {
dp[0][i] = i;
}
for (int i = 1; i < m+1; i++) {
for (int j = 1; j < n+1; j++) {
int dis = word1[i-1] == word2[j-1] ? 0 : 1;
dp[i][j] = 1 + dp[i - 1][j];
if (1 + dp[i][j - 1] < dp[i][j]) dp[i][j] = 1 + dp[i][j - 1];
if (dp[i - 1][j - 1] + dis < dp[i][j]) dp[i][j] = dp[i - 1][j - 1] + dis;
}
}
return dp[m][n];
}
};