力扣 動態規劃 兩個字串中最小ASCII和

2021-09-12 05:47:45 字數 2168 閱讀 1706

描述

給定兩個字串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函式如何確定

題目要求要計算ascii的和,最差情況是兩個字串每個字元的ascii碼相加

所以將dp陣列第0行第0列初始化為前i個字元的和

解決了初始化的問題後,接下來解決dp遞迴函式如何確定

下面分為兩種情況:

當前兩字元不相同的時候

dp[i][j] = min(dp[i - 1][j] + s1[i], dp[i][j - 1] + s2[j])

兩字元相同

dp[i][j] = dp[i - 1][j - 1]

在1中還有人想考慮dp[i - 1][j - 1] + s1[i] + s2[j]和min函式中兩項的大小,其實沒必要,因為此項必大於或等於上述兩項,這個簡單想一下就能明白了。

**(c++版)

int

minimumdeletesum

(string s1, string s2)

}return dp[lengths1]

[lengths2]

;}

class

solution

:def

minimumdeletesum

(self, s1:

str, s2:

str)

->

int:

dp =[[

0for i in

range

(len

(s2)+1

)]for i in

range

(len

(s1)+1

)]# dp陣列

for i in

range

(len

(s1)):

# 初始化dp行和列

dp[i +1]

[0]= dp[i][0

]+ord(s1[i]

)for i in

range

(len

(s2)):

dp[0]

[i +1]

= dp[0]

[i]+

ord(s2[i]

)for i in

range

(len

(s1)):

for j in

range

(len

(s2)):

if(s1[i]

== s2[j]):

dp[i +1]

[j +1]

= dp[i]

[j]else

: dp[i +1]

[j +1]

=min

(dp[i +1]

[j]+

ord(s2[j]

), dp[i]

[j +1]

+ord

(s1[i]))

return dp[

len(s1)][

len(s2)

]

兩個字串的編輯距離 動態規劃

字串的編輯距離,又稱為levenshtein距離,由俄羅斯的數學家vladimir levenshtein在1965年提出。是指利用字元操作,把字串a轉換成字串b所需要的最少運算元。其中,字元操作包括 1 刪除乙個字元 2 插入乙個字元 3 修改乙個字元 3 如果不一樣,那麼必定要經過一次操作 編輯...

連線兩個字串

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...