給你兩個單詞 word1 和 word2,請你計算出將 word1 轉換成 word2 所使用的最少運算元 。示例 1:你可以對乙個單詞進行如下三種操作:
插入乙個字元
刪除乙個字元
替換乙個字元
輸入:word1 = 「horse」, word2 = 「ros」示例 2:輸出:3
解釋:
horse -> rorse (將 『h』 替換為 『r』)
rorse -> rose (刪除 『r』)
rose -> ros (刪除 『e』)
總有共3步
輸入:word1 = 「intention」, word2 = 「execution」問題分析:1,如果想把word1變為word2,對於word1的操作我們有3種方式:輸出:5
解釋:
intention -> inention (刪除 『t』)
inention ->enention (將 『i』 替換為 『e』)
enention -> exention (將 『n』 替換為 『x』)
exention -> exection (將 『n』 替換為 『c』)
exection -> execution (插入 『u』)
總有共5步
這就好比對資料庫的增刪改查一樣,不過這裡沒有查詢。
我們用dp[i][j]表示把word1的前i個字元變為word2的前j個字元所需要的最少編輯距離,這裡要分兩種情況
1,當word1[i]==word2[j]:也就是說word1的第i個字元和word2的第j個字元相等,我們不需要修改word1的第i個字元,所以這時dp[i][j]=dp[i-1][j-1]。
2,當word1[i]!=word2[j]:也就是說word1的第i個字元和word2的第j個字元不相等。這時我們可以有3種操作來計算dp[i][j];
上面三種情況我們要選最小的,所以遞推公式
1,當word1[i]==word2[j]:
dp[i][j]=dp[i-1][j-1]
2,當word1[i]!=word2[j]:
dp[i][j]=min+1
邊界條件:
如果word1為空,我們要把word1變為word2就是不停的插入,
如果word2為空,我們要把word1變為word2就是不停的刪除。
下面我們來畫個圖看一下
舉個例子,01**部分比如(0,0)格內,我們只需要把h變為r即可,所以需要1步。
比如(0,1)格內,我們只需要把h變為r,然後刪除o,所以需要2步。
比如(1,0)格內,我們只需要把h變為r,然後在新增乙個o,所以需要2步。
比如(1,1)格內,因為o==o,我們只需要把h變為r即可,所以需要1步。
看懂了上面的分析過程,**就容易多了,我們來看下**
public
static
intmindistance
(string word1, string word2)
for(
int i =
0; i <= length2; i++
)for
(int i =
1; i <= word1.
length()
; i++
)else}}
util.
printtwointarrays
(dp)
;//測試資料的列印,可去掉
return dp[length1]
[length2]
;}
**比較簡單,核心**也就15到19行,其他的也就是一些邊界的判斷。
我們還用上面的資料測試一下,看一下列印結果
1public static
void
main
(string args)
結果如下
和我們上面分析的完全一致。
02
**優化
我們看到雖然dp是二維陣列,但我們計算的時候每個元素只和他的左邊,上邊,左上角的3個值有關,所以這裡我們還可以優化一下,使用一維陣列,我們看下**
public
static
intmindistance2
(string word1, string word2)
int last =0;
for(
int i =
1; i <= word1.
length()
; i++
)else
last = temp;
} util.
printintarrays
(dp)
;//這兩行**僅做測試列印資料使用,可刪除
system.out.
println()
;}return dp[length2]
;}
**中last記錄的是左上角的值,因為這個值會被覆蓋,所以我們提前記錄了下來,我們還用上面的**測試一下,再來看一下列印結果
結果和我們上面分析的完全一致。
總結:
這道題相對來說還是有一定的難度的,首先要了解什麼是動態規劃,然後再找出他的遞推公式,還有一些邊界條件的判斷,最後是**的優化。
動態規劃之編輯距離
演算法問題描述 設a和b是2個字串。要用最少的字元操作將字串a轉換為字串b。這裡所說的字元操作包括 1 刪除乙個字元 2 插入乙個字元 3 將乙個字元改為另乙個字元。將字串a變換為字串b所用的最少字元運算元稱為字串a到 b的編輯距離,記為d a,b 對於給定的字串a和字串b,計算其編輯距離 d a,...
動態規劃之編輯距離問題
由公式可以看出,i 1,j 對應刪除操作,i,j 1 對應插入操作。可以這樣理解,現在耗費了di 1,j步操作將字串a 1,i 1 轉換成了b 1,j 則在將a 1,i 轉換成b 1,j 時,我們可以直接刪掉字元a i 問題變成a 1,i 1 轉換成b 1,j 從而dij就等於di 1,j 1。同理...
動態規劃之編輯距離 2021 1 29
s1 family s2 frame s1 family s2 frame 編輯距離 4d 012 3451 0123 4211 1233 2221 2433 3225 4443 3655 544 process exited after 10.78 seconds with return valu...