583 兩個字串的刪除操作

2021-10-03 06:41:46 字數 1551 閱讀 5801

給定兩個單詞 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...