376,動態規劃之編輯距離

2022-09-18 09:42:14 字數 3645 閱讀 3022

給你兩個單詞 word1 和 word2,請你計算出將 word1 轉換成 word2 所使用的最少運算元 。

你可以對乙個單詞進行如下三種操作:

插入乙個字元

刪除乙個字元

替換乙個字元

示例 1:

輸入:word1 = 「horse」, word2 = 「ros」

輸出:3

解釋

horse -> rorse (將 『h』 替換為 『r』)

rorse -> rose (刪除 『r』)

rose -> ros (刪除 『e』)

總有共3步

示例 2:

輸入:word1 = 「intention」, word2 = 「execution」

輸出:5

解釋:

intention -> inention (刪除 『t』)

inention ->enention (將 『i』 替換為 『e』)

enention -> exention (將 『n』 替換為 『x』)

exention -> exection (將 『n』 替換為 『c』)

exection -> execution (插入 『u』)

總有共5步

問題分析:1,如果想把word1變為word2,對於word1的操作我們有3種方式:

這就好比對資料庫的增刪改查一樣,不過這裡沒有查詢。

我們用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就是不停的刪除。

下面我們來畫個圖看一下

舉個例子,

比如(0,0)格內,我們只需要把h變為r即可,所以需要1步。

比如(0,1)格內,我們只需要把h變為r,然後刪除o,所以需要2步。

比如(1,0)格內,我們只需要把h變為r,然後在新增乙個o,所以需要2步。

比如(1,1)格內,因為o==o,我們只需要把h變為r即可,所以需要1步。

看懂了上面的分析過程,**就容易多了,我們來看下**

01**部分

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...