算法練習(30):Edit Distance

題意:兩個字符串的編輯距離就是使兩個字符串變得一樣的操作數,做操包括插入刪除替換。

分析與思路:這道題是一道典型的動態規劃題目,類似這種兩個字符串的動態規劃,一般都需要一個二維數組維護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];
	}
};


發佈了80 篇原創文章 · 獲贊 72 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章