712 兩個字串的最小ASCII刪除和

2021-09-18 05:26:28 字數 1382 閱讀 8525

給定兩個字串s1, s2,找到使兩個字串相等所需刪除字元的ascii值的最小和。

示例 1:

輸入: s1 = 「sea」, s2 = 「eat」

輸出: 231

解釋: 在 「sea」 中刪除 「s」 並將 「s」 的值(115)加入總和。

在 「eat」 中刪除 「t」 並將 116 加入總和。

結束時,兩個字串相等,115 + 116 = 231 就是符合條件的最小和。

示例 2:

輸入: s1 = 「delete」, s2 = 「leet」

輸出: 403

解釋: 在 「delete」 中刪除 「dee」 字串變成 「let」,

將 100[d]+101[e]+101[e] 加入總和。在 「leet」 中刪除 「e」 將 101[e] 加入總和。

結束時,兩個字串都等於 「let」,結果即為 100+101+101+101 = 403 。

如果改為將兩個字串轉換為 「lee」 或 「eet」,我們會得到 433 或 417 的結果,比答案更大。

拿到這道題,看到這種字串玩轉並且求極值的,肯定是動態規劃,首先建立乙個二維陣列dp,其中dp[i][j]表示字串s1的前i個字元和字串s2的前j個字元變相等需要刪除字元的ascii值的總和,那麼一開始我們要初始化邊緣值,就是有乙個字串為空的情況下,需要將另外乙個字串也刪為空,這兩個字串就相等了,分別初始化dp的第一行和第一列,這裡假設s1儲存在列上,方法就是dp[i][0] = dp[i-1][0]+s1[i-1],(這裡需要注意的就是二維陣列的長度和寬度分別是對應字串的長度+1,因為兩個陣列不能重疊),再就是如果當前兩個字串的值相等時,即s1[i-1] == s2[j-1](i,j是從1開始遍歷的),就把之前的dp搬下來,在**中就是dp[i][j] = dp[i-1][j-1],因為在此時兩個字串已經匹配上了,所以直接就可以匹配下乙個字元,如果不相等,那就有兩種情況,第一種就是刪除s1的當前字元,那麼就是dp[i][j] = dp[i-1][j] + s1[i-1],第二種就是刪除s2的當前字元,那就是dp[i][j] = dp[i][j-1] + s2[j-1],因為不知道到底哪個是較小值,所以取它倆的較小值作為當前值參考參考**如下:

class

solution

for(

int j =

1;j<=m;

++j)

for(

int i =

1;i<=n;

++i)

else}}

return dp[n]

[m];}}

;

712 兩個字串的最小ASCII刪除和

解題思路主要 於leetcode官方與 程式設計師面試寶典 給定兩個字串s1,s2,找到使兩個字串相等所需刪除字元的ascii值的最小和。示例 1 輸入 s1 sea s2 eat 輸出 231 解釋 在 sea 中刪除 s 並將 s 的值 115 加入總和。在 eat 中刪除 t 並將 116 加...

連線兩個字串

include include void main char lianjie char a 30 char b 30 原型 extern char strcat char dest,char src 用法 include 功能 把src所指字串新增到dest結尾處 覆蓋dest結尾處的 0 並新增 ...

交換兩個字串

交換兩個字串,原來的字串分別為 學生 和 好 字串輸出顯示為 學生好 交換後輸出顯示為 好學生 include using namespace std int main char c1 5 學生 char c2 3 好 char m,n,t m c1 n c2 cout 交換前 m n n t co...