leetcode0072:
給你兩個單詞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')
對於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 替換為 ...