两个字符串的删除操作
思路
本題和動態規劃:115.不同的子序列相比,其實就是兩個字符串都可以刪除了,情況雖說復雜一些,但整體思路是不變的。
1. 確定dp數組(dp table)以及下標的含義
dp[i][j]:以i-1為結尾的字符串word1,和以j-1位結尾的字符串word2,想要達到相等,所需要刪除元素的最少次數。
2. 確定遞推公式
- 當word1[i - 1] 與 word2[j - 1]相同的時候
- 當word1[i - 1] 與 word2[j - 1]不相同的時候
那最后當然是取最小值,所以當word1[i - 1] 與 word2[j - 1]不相同的時候,遞推公式:dp[i][j] = min({dp[i - 1][j - 1] + 2, dp[i - 1][j] + 1, dp[i][j - 1] + 1});
3. dp數組如何初始化
從遞推公式中,可以看出來,dp[i][0] 和 dp[0][j]是一定要初始化的。
dp[i][0]:word2為空字符串,以i-1為結尾的字符串word2要刪除多少個元素,才能和word1相同呢,很明顯dp[i][0] = i。
dp[0][j]的話同理
4. 確定遍歷順序
從遞推公式 dp[i][j] = min(dp[i - 1][j - 1] + 2, min(dp[i - 1][j], dp[i][j - 1]) + 1); 和dp[i][j] = dp[i - 1][j - 1]可以看出dp[i][j]都是根據左上方、正上方、正左方推出來的。
所以遍歷的時候一定是從上到下,從左到右,這樣保證dp[i][j]可以根據之前計算出來的數值進行計算。
5. 舉例推導dp數組
以word1:“sea”,word2:"eat"為例,推導dp數組狀態圖如下:
總結
以上是生活随笔為你收集整理的两个字符串的删除操作的全部內容,希望文章能夠幫你解決所遇到的問題。