動態規劃之計算編輯距離

2021-10-07 09:36:24 字數 1634 閱讀 5838

解析:對於每對兒字元 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...