給出兩個單詞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.修改乙個 等價...