思路
第一步:定義數組元素的含義
當字符串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];
}
};