給出兩個單詞word1和word2,計算出將word1轉換成word2需要的最少運算元。
對乙個單詞可以進行三種操作:插入乙個字元、刪除乙個字元、替換乙個字元
舉例:
輸入:word1 =
"horse"
,word2 =
"ros"
輸出:3
步驟:將h替換為r得到rorse,刪除第二個r得到rose,刪除e得到ros
個人覺得,動態規劃問題最難的永遠是分析。
到現在為止,做過的動態規劃類的題基本分為三步:定義乙個狀態陣列,初始化陣列,迭代計算填充陣列。
在本例中,由於可以進行三種操作,分別進行分析。最後一步操作分別可以是插入字元、刪除字元和替換字元:
插入乙個字元。如果我們已知 horse 到 ro 的編輯距離為 a,則從 horse 到 ros 的編輯距離可以是 a+1,因為在經過 a 次操作將 horse 轉換成為 ro 後,再只需一步操作即向 horse 後新增 s 即可將 horse 轉換為 ros ;
刪除乙個字元。如果我們已知 hors 到 ros 的編輯距離為 b,則從 horse 到 ros 的編輯距離可以是 b+1,因為在經過 b 次操作將 hors 轉換成為 ros 後,再只需一步操作即刪除乙個字元 e 即可將 horse 轉換為 ros;
替換乙個字元。如果我們已知 hors 到 ro 的編輯距離為 b,則從 horse 到 ros 的編輯距離可以是 c+1,因為在經過 c 次操作將 hors 轉換成為 ro 後,再只需一步操作即將字元 e 替換為 s 即可將 horse 轉換為 ros。這一步的編輯距離也可以是 c ,當兩個字串的最後乙個字元相等時成立。
綜上,將 horse 轉換為 ros 的編輯距離應該是 min(a+1,b+1,c+1)。
如果我們定義乙個陣列 dp[m+1][n+1],m,n分別為字串 word1 和 word2 的長度,dp[i][j]表示從字串 word1 的前 i 個字元組成的子串 到 字串word2的前 j 個字元組成的子串 的編輯距離。可以得到狀態轉換方程:
dp[i][j] = min(dp[i-1][j]+1, dp[i][j-1]+1, dp[i-1][j-1]/dp[i-1][j-1]+1)
具體來說,
當 word1[i-1][j-1] == word2[i-1][j-1]時,
dp[i][j] = min(dp[i-1][j]+1, dp[i][j-1]+1, dp[i-1][j-1]);
當 word1[i-1][j-1] != word2[i-1][j-1]時,
dp[i][j] = min(dp[i-1][j]+1, dp[i][j-1]+1, dp[i-1][j-1]+1);
依次迭代,最終dp[i][0] = i,表示從 i 個字元的子串到空串的編輯距離為 i ,dp[0][j] = j,表示從空串到 j 個字元的字串的編輯距離為 j 。
int
min(
int a,
int b,
int c)
intmindistance
(char
* word1,
char
* word2)
}//初始化
for(i =
1; i < m+
1;i++
)for
(j =
1; j < n+
1;j++
)//計算
for(i =
1; i < m+
1; i++
)else}}
return dp[m]
[n];
}
執行結果:
動態規劃求編輯距離
編輯距離,又稱levenshtein距離,是指兩個字串之間,由乙個轉成另乙個所需的最少編輯操作次數。許可的編輯操作包括將乙個字元替換成另乙個字元,插入乙個字元,刪除乙個字元。例如將kitten一字轉成sitting sitten k s sittin e i sitting g 動態規劃是解決該問題...
編輯距離問題c語言實現
所謂編輯距離是指乙個字串轉化成另外乙個字串所需要的最少編輯次數。1 增加乙個字元 2 刪除乙個字元 3 用乙個字元替換原來的字元 解決的方法當然是動歸了。首先研究子問題,假設兩字串a,b。1 當兩個字串長度為1時,若字元相同則編輯距離為0 若不同則為1 2 當乙個a的長度為1,b的長度為n時,先利用...
動態規劃 編輯距離
1.實踐題目 編輯距離 2.問題描述 設a和b是2個字串。要用最少的字元操作將字串a轉換為字串b。這裡所說的字元操作包括 1 刪除乙個字元 2 插入乙個字元 3 將乙個字元改為另乙個字元。將字串a變換為字串b所用的最少字元運算元稱為字串a到 b的編輯距離,記為d a,b 對於給定的字串a和字串b,計...