日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

两个字符串的删除操作

發布時間:2024/4/18 编程问答 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 两个字符串的删除操作 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

思路

本題和動態規劃: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] = dp[i - 1][j - 1]; 當word1[i - 1] 與 word2[j - 1]不相同的時候,有三種情況:情況一:刪word1[i - 1],最少操作次數為dp[i - 1][j] + 1 情況二:刪word2[j - 1],最少操作次數為dp[i][j - 1] + 1 情況三:同時刪word1[i - 1]和word2[j - 1],操作的最少次數為dp[i - 1][j - 1] + 2

那最后當然是取最小值,所以當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數組狀態圖如下:

總結

以上是生活随笔為你收集整理的两个字符串的删除操作的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。