LeetCode72. Edit Distance 動態規劃 C++實現
題目鏈接
題目大意
給定兩個字符串word1
和word2
,求最短編輯距離,即通過增刪改操作能夠使得兩個字符串變成一個字符串的最少步驟的步數
算法思路
根據題意,基於動態規劃的思想,dp[i][j]
爲子串word1[0...i]
與子串word2[0...j]
的編輯距離,初始化,第一行,dp[0][i] = i;
,第一列,dp[i][0] = i
,因爲,對於第一行,此時的word1
的子串爲空串,和word2
的子串的距離爲word1
增加字符的個數,而對於第一列,此時的word2
爲空串,則word1
和word2
的距離即爲word1
刪除的字符個數,動態轉移方程爲dp[i][j] = (word1[i - 1] == word2[j - 1] ? dp[i - 1][j - 1] : 1 + min(dp[i - 1][j - 1], min(dp[i - 1][j], dp[i][j - 1])));
,即考慮兩種情況
- 若
word1
的第i
個字符和word2
第j
個字符相等,則無需操作,dp[i][j] = dp[i - 1][j - 1];
- 若
word1
的第i
個字符和word2
第j
個字符不相等,可以有三種選擇,分別爲刪除一個word1
字符、增加一個word1
字符和替換一個word1
字符,即基於已完成操作步驟數dp[i - 1][j]
刪除word1
一個字符或增加word2
一個字符基於已完成操作步驟數dp[i][j - 1]
增加word1
一個字符或刪除word2
一個字符和基於已完成操作步驟數dp[i - 1][j - 1]
替換word1
或word2
一個字符,增刪改的步驟數都爲1
,動態轉移方程選取最小的一個加上步驟數1
最後返回dp[word1.length()][word2.length()]
即可
AC代碼
class Solution {
public:
int minDistance(string word1, string word2) {
vector<vector<int> > dp(word1.length() + 1, vector<int> (word2.length() + 1, 0));
for (int i = 0; i < dp.size(); i++) {
dp[i][0] = i;
}
for (int i = 0; i < dp[0].size(); i++) {
dp[0][i] = i;
}
for (int i = 1; i < dp.size(); i++) {
for (int j = 1; j < dp[i].size(); j++) {
dp[i][j] = (word1[i - 1] == word2[j - 1] ? dp[i - 1][j - 1] : 1 + min(dp[i - 1][j - 1], min(dp[i - 1][j], dp[i][j - 1])));
}
}
return dp[word1.length()][word2.length()];
}
};
樣例輸入1
horse
ros
樣例輸出1
3
樣例輸入2
intention
execution
樣例輸出2
5
鳴謝
最後
- 由於博主水平有限,不免有疏漏之處,歡迎讀者隨時批評指正,以免造成不必要的誤解!