描述
給定兩個字串s1, s2,找到使兩個字串相等所需刪除字元的ascii值的最小和。
示例1
輸入: s1 = 「sea」, s2 = 「eat」示例2輸出: 231
解釋: 在 「sea」 中刪除 「s」 並將 「s」 的值(115)加入總和。
在 「eat」 中刪除 「t」 並將 116 加入總和。
結束時,兩個字串相等,115 + 116 = 231 就是符合條件的最小和。
輸入: 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...