【LeetCode】72. 編輯距離

思路

第一步:定義數組元素的含義

當字符串word1的長度爲i,字符串word2的長度爲j時,將word1轉化爲word2所使用的最少操作次數爲dp[i][j]
這句定義可以說使理解這道題目的核心,一定要理解dp數組的含義,這樣纔會理解關係式是如何得出的

第二步:找出關係數組元素間的關係時

我們的目標是,從規模小的,通過一些操作,推導出規模大的。對於這道題,對word1進行三種操作
插入、刪除、替換
由於我們是要讓操作的次數最小,所以我們要尋找最佳操作
2.2 當word1[i]```與`word[j]相等,這個時候不需要任何操作,此時最少操作次數dp[i][j]=dp[i-1][j-1]
2.3 如果不相等,此時有三種操作

  • 2.3.1 如果實行插入dp[i][j]=dp[i][j-1]+1;
  • 2.3.2 如果實行刪除dp[i][j]=dp[i-1][j]+1;
  • 2.3.3 如果實行替換dp[i][j]=dp[i-1][j-1]+1;

第三步:找出初始值

如果i或者j有一個爲0,則word1要麼一直插入(i==0),要麼一直刪除(j==0),才能到達word2

代碼

class Solution {
public:
	int minDistance(string word1, string word2) {
		int n1 = word1.length();
		int n2 = word2.length();
		//特判
		//if (n1*n2==0) return n1+n2;
		//定義數組元素的含義
		vector<vector<int>> dp(n1+1, vector<int>(n2+1));
		//初始值
		for (int j = 1; j <= n2; j++)//插入
		{
			dp[0][j] = dp[0][j - 1] + 1;
		}
		for (int i = 1; i <= n1; i++)//刪除
		{
			dp[i][0] = dp[i - 1][0] + 1;
		}
		//狀態轉移
		for (int i = 1; i <=n1; i++)
		{
			for (int j = 1; j <=n2; j++)
			{
				if (word1[i-1] == word2[j-1]) {
					dp[i][j] = dp[i - 1][j - 1];
				}
				else
				{
					dp[i][j] = min(dp[i - 1][j], min(dp[i][j - 1], dp[i - 1][j - 1])) + 1;
						//刪除、插入、替換
				}
			}
		}
		return dp[n1][n2];
	}
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章