解析:對於每對兒字元 s1[i] 和 s2[j],可以有四種操作:
if s1[i]
== s2[j]
: 啥都別做(skip)
i, j 同時向前移動
else
: 三選一:
插入(insert)
刪除(delete)
替換(replace)
def
minidistance
(s1, s2)
:def
dp(i, j)
:if i ==-1
:return j +
1if j ==-1
:return i +
1if s1[i]
== s2[j]
:return dp(i -
1, j -1)
# 啥都不做
else
:return
min(dp(i -
1, j -1)
+1,# 替換.我直接把 s1[i] 替換成 s2[j],這樣它倆就匹配了,同時前移 i,j 繼續對比,運算元加1
dp(i -
1, j)+1
,# 刪除. 我直接把s[i] 這個字元刪掉,前移 i,繼續跟 j 對比, 運算元加一
dp(i, j -1)
+1,# 插入.我直接在 s1[i] 插入乙個和s2[j]一樣的字元,那麼 s2[j] 就被匹配了,前移 j,繼續跟 i 對比,別忘了運算元加一
)return dp(
len(s1)-1
,len
(s2)-1
)
def
minidistance
(s1, s2)
: m =
len(s1)
n =len(s2)
dp =[[
0]*(n +1)
for _ in
range
(m +1)
]for i in
range
(m +1)
: dp[i][0
]= i
for j in
range
(n +1)
: dp[0]
[j]= j
# bottom to up
for i in
range(1
, m +1)
:for j in
range(1
, n +1)
:if s1[i -1]
== s2[j -1]
: dp[i]
[j]= dp[i -1]
[j -1]
else
: dp[i]
[j]=
min(dp[i -1]
[j -1]
, dp[i]
[j -1]
, dp[i -1]
[j])+1
return dp[m]
[n]
動態規劃 編輯距離
1.實踐題目 編輯距離 2.問題描述 設a和b是2個字串。要用最少的字元操作將字串a轉換為字串b。這裡所說的字元操作包括 1 刪除乙個字元 2 插入乙個字元 3 將乙個字元改為另乙個字元。將字串a變換為字串b所用的最少字元運算元稱為字串a到 b的編輯距離,記為d a,b 對於給定的字串a和字串b,計...
動態規劃 編輯距離
給定兩個序列x和y,求從乙個序列到另乙個序列所需變換的最小次數,這裡的變換包括刪除,新增和替換,每次只對乙個元素進行操作。演算法序言 這個題目有點像之前寫的最長公共子串行問題,也是用動態規劃的演算法。能夠應用動態規劃的題目有乙個特點就是具有最優子結構,就是整個問題的最優解會包含子問題的最優解,那麼我...
動態規劃 編輯距離
將乙個字串變為另乙個字串最小操作次數,您對單詞允許以下3種操作 a 插入字元 b 刪除字元 c 替換字元 例如 a horse 變成 b ros 想法 coding utf 8 def char array replace array1,array2 row len array1 col len a...