題目描述:
給你兩個單詞 word1 和 word2,請你計算出將 word1 轉換成 word2 所使用的最少運算元 。題目解析:你可以對乙個單詞進行如下三種操作:
插入乙個字元
刪除乙個字元
替換乙個字元
示例 1:
輸入:word1 = 「horse」, word2 = 「ros」
輸出:3
解釋:horse -> rorse (將 『h』 替換為 『r』)
rorse -> rose (刪除 『r』)
rose -> ros (刪除 『e』)
示例 2:
輸入:word1 = 「intention」, word2 = 「execution」
輸出:5
解釋:intention -> inention (刪除 『t』)
inention -> enention (將 『i』 替換為 『e』)
enention -> exention (將 『n』 替換為 『x』)
exention -> exection (將 『n』 替換為 『c』)
exection -> execution (插入 『u』)
不難總結出:對於每乙個狀態而言,f(i , j)=min( 替,插、刪)接下來,按照動態規劃步驟從頭分析一遍替:f(i ,j)=f[i - 1][ j -1]+1 必須滿足二者不相等,否則無需替換
插:f(i ,j)=f[ i ] [ j - 1 ]+1
刪:f(i ,j)=f[ i - 1][ j ]+1
確定問題。求最小次數f(i,j)
舉例分析,如上圖中例子
拆分問題。對於每乙個字元所在的位置而言,等於從前的某一步+1
動態轉移方程:f(i,j)=min(插,刪,替)
替:f(i ,j)=f[i - 1][ j -1]+1 必須滿足二者不相等,否則無需替換
插:f(i ,j)=f[ i ] [ j - 1 ]+1
刪:f(i ,j)=f[ i - 1][ j ]+1
初始狀態:空字元到某乙個字元使用插,次數為長度;某乙個字元到空字元使用刪,次數為長度
記錄法儲存每乙個狀態。需要二維陣列,橫座標每一位代表源字元,縱座標每一位代表目標字元
int
mindistance
(string word1, string word2)
for(
int i=
0;i1;i++
)//開始記錄
for(
int i=
1;i1;i++)}
return dp[len1]
[len2]
;}
演算法 編輯距離 動態規劃
1.解題思路 這道題是典型的動態規劃的題,也是比較簡單的動態規劃的題,在這裡記錄一下,一是要求自己不要鬆懈,二是彌補自己在動態規劃上的不足。我們在這道題上,處理每乙個字元無非就是3種操作,增加字元 刪除字元 替換字元。首先,我們定義乙個dp word1.length 1 word2.length 1...
演算法 最小編輯距離 動態規劃
給定兩個單詞 word1 和 word2,計算出將 word1 轉換成 word2 所使用的最少運算元 你可以對乙個單詞進行如下三種操作 插入乙個字元 刪除乙個字元 替換乙個字元 示例 1 輸入 word1 horse word2 ros 輸出 3 解釋 horse rorse 將 h 替換為 r ...
動態規劃 編輯距離
1.實踐題目 編輯距離 2.問題描述 設a和b是2個字串。要用最少的字元操作將字串a轉換為字串b。這裡所說的字元操作包括 1 刪除乙個字元 2 插入乙個字元 3 將乙個字元改為另乙個字元。將字串a變換為字串b所用的最少字元運算元稱為字串a到 b的編輯距離,記為d a,b 對於給定的字串a和字串b,計...