給定兩個單詞 word1 和 word2,找到使得 word1 和 word2 相同所需的最小步數,每步可以刪除任意乙個字串中的乙個字元。
示例 1:
說明:1.給定單詞的長度不超過500。
2.給定單詞中的字元只含有小寫字母。
為了求得最少刪除次數,我們可以求出串 s1和串 s2最長公共子串行,我們記為 lcs。如果我們能求得 lcs的值,我們可以輕易地求出答案,為 m + n - 2*lcs。這裡 m 和 n分別是給定字串 s1和 s2 的長度。
class
solution
else}}
return word1.
size()
+ word2.
size()
-2*dp[word1.
size()
][word2.
size()
];}}
;
時間複雜度:o(m
∗n)o(m*n)
o(m∗n)
,我們需要填充大小為 m∗n
m * n
m∗n 的陣列 dpdp
dp。m
mm 和 n
nn分別是 wor
d1word1
word
1 和 wor
d2word2
word
2 字串的長度。
空間複雜度:o(m
∗n)o(m*n)
o(m∗n)
我們不通過求解 lcs 再求解刪除次數的方法來求解問題,直接使用動態規劃來求解刪除次數。
使用二維陣列 dp,現在 dp[i][j]表示 s1 串前 i個字元和 s2 串前 j個字元匹配的最少刪除次數。同樣我們逐行求解 dp陣列。為了求出 dp[i][j],我們只考慮 兩種情況:
(1)s1[i-1] 和 s2[j-1]匹配,那麼我們只需要讓 dp[i][j]賦值為 dp[i-1][j-1]即可。這是因為兩個字串能匹配的字元不需要被刪除。
(2)字元 s1[i-1]和 s2[j-1]不匹配。這種情況下,我們需要考慮刪除兩個字元中的哪乙個,同時需要增加一次刪除操作。兩種可能的選擇是 dp[i-1][j]和 dp[i][j-1]。我們從中選擇較小值。
最後,dp[m][n]就是我們需要的最少刪除次數,m 和 n 分別是字串 s1 和字串 s2 的長度。
class
solution
else
if(word1[i-1]
== word2[j-1]
)else}}
return dp[m]
[n];}}
;
時間複雜度:o(m
∗n)o(m*n)
o(m∗n)
空間複雜度:o(m
∗n)o(m*n)
o(m∗n)
583 兩個字串的刪除操作
題目描述 給定兩個單詞 word1 和 word2,找到使得 word1 和 word2 相同所需的最小步數,每步可以刪除任意乙個字串中的乙個字元。解題思路 動態規劃,和最長公共子串行相似,根據當前結尾的兩個字元是否相等選擇不同的轉移方式,如下 class solution def mindista...
583 兩個字串的刪除操作
題目描述 給定兩個單詞 word1 和 word2,找到使得 word1 和 word2 相同所需的最小步數,每步可以刪除任意乙個字串中的乙個字元。示例 輸入 sea eat 輸出 2 解釋 第一步將 sea 變為 ea 第二步將 eat 變為 ea 給定單詞的長度不超過500。給定單詞中的字元只含...
583 兩個字串的刪除操作
解題思路主要 於leetcode官方與 程式設計師面試寶典 給定兩個單詞 word1 和 word2,找到使得 word1 和 word2 相同所需的最小步數,每步可以刪除任意乙個字串中的乙個字元。示例 輸入 sea eat 輸出 2 解釋 第一步將 sea 變為 ea 第二步將 eat 變為 ea...