- 題目:
給定兩個字word1和word2,找到將word1轉換為word2所需的最小步驟數。 (每個操作計為1步)。 您對單詞允許以下3種操作: a)插入字符 b)刪除字符 c)替換字符
- 思路:
dp[i][j]指把word1[0..i - 1]轉換為word2[0..j - 1] 的最小操作數。
邊界條件:
dp[i][0] = i; 從長度為 i 的字符串轉為空串 要刪除 i 次
dp[0][j] = j. 從空串轉為長度為 j 的字符串 要添加 j 次一般情況:
如果word[i - 1] == word2[j - 1],則dp[i][j] = dp[i - 1][j - 1],因為不需要進行操作,即操作數為0.
如果word[i - 1] != word2[j - 1],則需考慮三種情況,取最小值:
Replace word1[i - 1] by word2[j - 1]: (dp[i][j] = dp[i - 1][j - 1] + 1 (for replacement));
Delete word1[i - 1]: (dp[i][j] = dp[i - 1][j] + 1 (for deletion));
Insert word2[j - 1] to word1[0..i - 1]: (dp[i][j] = dp[i][j - 1] + 1 (for insertion)). - 代碼
class Solution { public: int minDistance(string word1, string word2) { int row = word1.size(); int col = word2.size(); vector<vector<int> >dp(row+1, vector<int>(col+1, 0)); for (int i=1; i<=row; i++) dp[i][0] = i;//從長度為i的字符串到空串需要變換i次 for (int j=1; j<=col; j++) dp[0][j] = j;//從長度為kong的字符串到長度為j的字符串需要變換j次 for (int i=1; i<=row; i++){ for (int j=1; j<=col; j++){ if (word1[i-1] == word2[j-1]) dp[i][j] = dp[i-1][j-1]; else dp[i][j] = min(min(dp[i-1][j-1]+1,dp[i-1][j] +1), dp[i][j-1]+1 ); } } return dp[row][col]; } };