給定兩個單詞 word1 和 word2,計算出將 word1 轉換成 word2 所使用的最少操做數 。算法
你能夠對一個單詞進行以下三種操做:函數
插入一個字符
刪除一個字符
替換一個字符spa
代碼實現:3d
1 # 編輯距離 2 class Solution: 3 def minDistance(self, word1: str, word2: str) -> int: 4 m = len(word2) 5 n = len(word1) 6 mem = [[0 for col in range(m + 1)] for row in range(n + 1)] 7 for i in range(n + 1): 8 mem[i][0] = i 9 mem[0] = [i for i in range(m+1)] 10 for row in range(1, n+1): 11 for col in range(1, m+1): 12 if word1[row-1] == word2[col-1]: 13 mem[row][col] = 1 + min(mem[row-1][col], mem[row][col-1],mem[row-1][col-1]-1) 14 else: 15 mem[row][col] = 1 + min(mem[row-1][col], mem[row][col-1],mem[row-1][col-1]) 16 return mem[-1][-1]
算法原理:code
藍色邊界:列爲word1子序列轉換爲空所須要的操做次數;行爲空序列轉換爲word2的子序列須要的次數;blog
計算步驟:io
算法思想:class
紅色部分注意,min函數裏面最後一項減去了1;爲何要這樣操做呢?這是由於在等式的右邊第一項就是1,而這個1表示無論min函數取到什麼都要進行一次操做:當取到mem[i-1,j]表示要刪除word1中新加入的字符mem[i-1,j]已經能夠將子序列轉化爲word2的目標子序列;當取mem[i,j-1]時,則爲插入一個word2新加入子序列的字符;當取mem[i-1,j-1]時,能夠將word1加入的元素替換爲word2加入的元素。三種狀況都是一步操做獲得mem[i,j],可是咱們應該注意到兩個單詞新加入的字符不會影響刪除和插入操做,對替換卻有很大的影響,若兩個字符相同,咱們根本不須要替換操做,因此當兩個字符相同時,mem[i-1,j-1]要先減去1,由於在前面爲了形式統一已經加過1了。原理