動態規劃演算法 計算兩個字串的編輯距離

2021-09-13 10:45:07 字數 1075 閱讀 4581

兩個字串的編輯距離即為兩個字串s1, s2經過插入、刪除和替換操作使得第乙個字串s1與第二個字串s2相同所需的最短操作次數。(s1字元個數為m, s2字元個數為n)

利用動態規劃的方法,考慮從字串的最後乙個字元開始進行推導,當最後乙個字元相同時,此時問題即為求s1[:m-1]與s2[:n-1]的編輯距離;而若最後乙個字元不相同時,可以考慮三種情況:1、在s1最後插入s2的最後乙個字元,此時問題轉化為s1[:m]與s2[:n-1]的編輯距離;2、刪除s1最後乙個字串,此時問題轉化為s1[:m-1]與s2[:n]的編輯距離;3、替換s1最後乙個字元為s2的最後乙個字元,此時問題轉化為s1[:m-1]與s2[:n-1]的編輯距離。可以看出上面的思想即為動態規劃的子問題的思想。以下利用python完成計算字串的編輯距離。

# 計算編輯距離

def editdistdp(s1, s2):

# change s1 to s2, use min steps

# return the number of steps

m = len(s1)

n = len(s2)

distance_list = [[0 for _ in range(n+1)] for _ in range(m+1)]

for i in range(m+1):

for j in range(n+1):

if i == 0:

distance_list[i][j] = j

elif j == 0:

distance_list[i][j] = i

elif s1[i-1] == s2[j-1]:

distance_list[i][j] = distance_list[i-1][j-1]

else:

distance_list[i][j] = 1 + min(distance_list[i][j-1], distance_list[i-1][j], distance_list[i-1][j-1])

return distance_list[m][n]

例如計算editdistdp('sunday', 'saturday')           output: 3

動態規劃演算法求兩個字串的最大公共子串

include stdafx.h include windows.h include include include include assert.h using namespace std 時間複雜度和空間複雜度均為 o p q 其中p q分別為兩個字串的長度,有待改進 獲取兩個字串公共子串 in...

使用動態規劃演算法求兩個字串的最長公共子串

編寫函式,獲取兩段字串的最長公共子串的長度 csdn部落格 下面不多說,直接上 vivo 找到兩個字串中的最長公共子串.cpp 找出兩個字串中最大公共子字串 如 abccade dgcadde 的最大子串為 cad 分析思路 使用動態規劃演算法 參考自csdn部落格 include pch.h in...

計算兩個字串的距離演算法

題目的描述為 將乙個字串變成另乙個字串,方式為新增乙個字元,刪除乙個字元,替換乙個字元,求這些操作的做小次數,例如字串db adcb 兩個字串,通過新增a和c兩個字元獎db編輯成adcb,這個兩個字串的距離為2 思路 定義乙個二維代價陣列dp n m 設新增乙個字元的代價為 ic inseret c...