lintcode練習 119 編輯距離

2021-08-26 05:28:21 字數 1757 閱讀 5955

給出兩個單詞word1和word2,計算出將word1 轉換為word2的最少操作次數。

你總共三種操作方法:

給出 work1="mart" 和 work2="karma"

返回 3 

當i=0時,dp[(0,j)]=j,j=0....len(word2),表示word2需要刪除j位來使其與word1相同為空;同理當j=0,dp[(i,0)]=i,i=0,...,len(word1)。

對於末尾字元相同:dp[(i, j)]= dp[(i-1, j-1)],表示都看前一位

對於末尾字元不同:

2.1 修改某個字串的最後一位使它們相同:dp[(i, j)]=dp[(i-1, j-1)]+1

2.2 在word1後插入word2末尾字元或直接刪除word2末尾:dp[(i, j)]=dp[(i-1, j)]+1

2.3 在word2後插入word1末尾字元或直接刪除word1末尾:dp[(i, j)]=dp[(i, j-1)]+1

即,dp[(i,j)]=min(dp[(i-1, j-1)],dp[(i-1, j)],dp[(i, j-1)]) + 1。

最後返回dp[(len(word1, len(word2)))]即可。

class solution:

"""@param word1: a string

@param word2: a string

@return: the minimum number of steps.

"""def mindistance(self, word1, word2):

# write your code here

m, n = len(word1), len(word2)

self.dp = {}

return self.helper(m, n, word1, word2)

def helper(self, i, j, word1, word2):

if (i, j) in self.dp:

return self.dp[(i, j)]

#如果其中乙個為空,另乙個要刪除自身長度來達到空

if i == 0:

self.dp[(i, j)] = j

return j

elif j == 0:

self.dp[(i, j)] = i

return i

#如果兩個字元的末尾字元相同,就向前看一位

if word1[i-1] == word2[j-1]:

self.dp[(i, j)] = self.helper(i-1, j-1, word1, word2)

return self.dp[(i, j)]

'''對於末尾字元不同:

2.1 修改某個字串的最後一位使它們相同:dp[i][j]=dp[i-1][j-1]+1

2.2 在word1後插入word2末尾字元或直接刪除word2末尾:dp[i][j]=dp[i][j-1]+1

2.3 在word2後插入word1末尾字元或直接刪除word1末尾:dp[i][j]=dp[i-1][j]+1

'''else:

self.dp[(i, j)] = min(self.helper(i-1, j-1, word1, word2),

self.helper(i-1, j, word1, word2),

self.helper(i, j-1, word1, word2)) + 1

return self.dp[(i, j)]

SICP練習 13 練習1 19

練習1.19 題目中說道斐波那契數中將變換t的n次方應用於對偶 1,0 而產生出來,而現在將t看作t pq 中p 0和q 1的特俗情況。因此對於對偶 a,b 來說,a bq a p q b bp aq。而對於t pq 的平方也就是 t pq 2,就像之前的a中往b乘以q和往a乘以 p q 現在依舊是...

SICP練習 13 練習1 19

練習1.19 題目中說道斐波那契數中將變換t的n次方應用於對偶 1,0 而產生出來,而現在將t看作t pq 中p 0和q 1的特俗情況。因此對於對偶 a,b 來說,a bq a p q b bp aq。而對於t pq 的平方也就是 t pq 2,就像之前的a中往b乘以q和往a乘以 p q 現在依舊是...

LintCode 編輯距離

你總共三種操作方法 返回 3 思路 使用dp,先定義狀態 f i j 單詞1 的前i個 跟 單詞2 的前j個 的最短編輯距離。如果 a i b j 那麼f i,j f i 1,j 1 然後,再看有三種狀態 1.增加乙個 等價於 f i,j 1 2.刪除乙個 等價於 f i 1,j 3.修改乙個 等價...