leetcode-72. Edit Distance
阿新 • • 發佈:2019-02-03
問題描述:Word1要經過多少步操作才能變成Word2
操作:增加一個字元;刪除一個字元;替換一個字元
思路:設dp[i][j]為將Word1前i個字元轉換成Word2前j個字元所需操作步數,則問題轉換為求dp[len1][len2]
dp[i][j]可以由以下幾種路徑得出:
1. 在已知dp[i-1][j]的情況下,Word1再刪除一個字元
2. 在已知dp[i][j-1]的情況下,Word1再增加一個字元
3. 若Word1[i] == Word2[j],則在dp[i-1][j-1]上不用任何操作
3. 若Word1[i] != Word2[j],則在dp[i-1][j-1]上替換Word1[i] 為 Word2[j]
初始狀態:
dp[i][0] = i
dp[0][j] = j
#include <algorithm> using namespace std; class Solution { public: int minDistance(string word1, string word2) { int len1 = word1.size(), len2 = word2.size(); int dp[len1+1][len2+1]; for(int i = 0; i <= len1; i++){ dp[i][0] = i;//刪除 } for(int j = 0; j <= len2; j++){ dp[0][j] = j;//增加 } for(int i = 1; i <= len1; i++){ for(int j = 1; j <= len2; j++){ if(word1[i-1] == word2[j-1]) dp[i][j] = min(dp[i][j-1] + 1, min(dp[i-1][j] + 1, dp[i-1][j-1])); else dp[i][j] = min(dp[i][j-1] + 1, min(dp[i-1][j] + 1, dp[i-1][j-1] + 1)); } } return dp[len1][len2]; } };