編輯距離筆記

2021-10-22 09:26:53 字數 3393 閱讀 5948

leetcode0072:

給你兩個單詞word1word2,請你計算出將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')

對於word1字串:"abc",要將其轉換為cefgh,先用乙個**記錄word1裡對每個字元的操作後的狀態:索引0

1234

50:(指向"",""是空串)

1:(指向"a",「a」)

2:(指向"b",「ab」)

3:(指向"c",「abc」)

對於[0-3, 0]:

初始化結束後,開始填表。 索引

0123

450:(指向"",""是空串)01

2345

1:(指向"a",「a」)

12:(指向"b",「ab」)

23:(指向"c",「abc」)3

然後取以上三種操作中的最小值,就是最佳的改變,也就是"a"->"c"的最短距離。 索引

0123

450:(指向"",""是空串)01

2345

1:(指向"a",「a」)11

2:(指向"b",「ab」)

23:(指向"c",「abc」)3

取以上三種操作的最小值。 索引

0123

450:(指向"",""是空串)01

2345

1:(指向"a",「a」)11

22:(指向"b",「ab」)

23:(指向"c",「abc」)3

索引012

3450:(指向"",""是空串)01

2345

1:(指向"a",「a」)11

2345

2:(指向"b",「ab」)

23:(指向"c",「abc」)3

取它們的最小值,就是最小的編輯次數。 索引

0123

450:(指向"",""是空串)01

2345

1:(指向"a",「a」)11

2345

2:(指向"b",「ab」)22

3:(指向"c",「abc」)3

索引012

3450:(指向"",""是空串)01

2345

1:(指向"a",「a」)11

2345

2:(指向"b",「ab」)22

23:(指向"c",「abc」)3

取最小。

把i=2行填完: 索引

0123

450:(指向"",""是空串)01

2345

1:(指向"a",「a」)11

2345

2:(指向"b",「ab」)22

2345

3:(指向"c",「abc」)3

取最小。

順便填多幾個,剩下最後乙個。 索引

0123

450:(指向"",""是空串)01

2345

1:(指向"a",「a」)11

2345

2:(指向"b",「ab」)22

2345

3:(指向"c",「abc」)32

334

取最小。

最後的位置填5,於是修改的最小次數就是5,可以使得word1"abc"->word2"cefgh"

update = ? // 如果替換的時候,字元相等,為0,否則為1;其它的+1是因為插入和刪除的確是進行了一次操作,只有替換需要判斷

dp[i][j] = math.min(math.min(dp[i - 1][j - 1] + update, dp[i - 1][j] + 1), dp[i][j - 1] + 1);

public

intmindistance

(string word1, string word2)

// 記錄狀態

int length1 = word1.

length()

+1;int length2 = word2.

length()

+1;int

dp =

newint

[length1]

[length2]

;// 初始化

for(

int i =

1; i < length1; i++

)for

(int j =

1; j < length2; j++

)int update;

for(

int i =

1; i < length1; i++)}

return dp[length1 -1]

[length2 -1]

;}

private

final solution solution =

newsolution()

;@test

public

void

test01()

@test

public

void

test02()

@test

public

void

test03()

5
10
5

演算法筆記 編輯距離

原題 給出兩個單詞word1和word2,計算出將word1 轉換為word2的最少操作次數。你總共三種操作方法 給出 work1 mart 和 work2 karma 返回 3 下面是兩種思路實現,自頂向上方法和自頂向下方法 不如將問題簡化下,化成規模比較小的問題。首先,我們先考慮兩個空串,那麼當...

最短編輯距離 筆記

思路 線性dp的經典問題,首先是 狀態表示 接下來是 轉移方程的推導 推導的思路就是看dp i j 能由哪些狀態轉移過來 這不是廢話麼 由於每次可以進行三種操作,所以我們可以從操作上進行考慮 1.刪除操作 想一下dp i j 要進行刪除操作後才會使a的前i個與b的前j個相同,換而言之a的前i 1個應...

《LeetCode筆記98》 編輯距離

給你兩個單詞 word1 和 word2,請你計算出將 word1 轉換成 word2 所使用的最少運算元 你可以對乙個單詞進行如下三種操作 插入乙個字元 刪除乙個字元 替換乙個字元 示例 1 輸入 word1 horse word2 ros 輸出 3 解釋 horse rorse 將 h 替換為 ...