leetcode 72編輯距離

2021-09-26 07:31:09 字數 1844 閱讀 3851

想到動態規劃是第一步,其次hhh。

先看官方解釋:

dp[i][j]表示str1前i個字元與str2前j個字元匹配所需的最少次數;str1="horse",str2="ros"

當我們知道dp[i][j],dp[i+1][j],dp[i][j+1]後就可以分兩種情況來討論了;

1---當str1[i+1]=str2[j+1]時,就等於給的例子中,匹配hors和ros時;

dp[i+1][j+1]=1+;

我們乙個乙個看;最重要的是前面的1代表的是什麼操作;

dp[i][j]表示hor,ro匹配的最少次數,你管我怎麼匹配得到的,反正我現在已經得到ro了,那麼最後的s就不用特殊處理了;所以-1+1=0;

dp[i][j+1]表示hor,ros匹配的最少次數,我都匹配完了,直接把剛加入的s給刪掉不就行了,所以1對應的是刪除操作;

dp[i+1][j]表示hors,ro匹配的最少次數,同樣的,我在最後再新增乙個s不就得了,所以這裡1對應的是插入操作;

------------更新

實際上;對於上面這種情況,是不需要取最小值的;

我們比較 dp[i][j]-1(表示hor,ro匹配的最少次數),dp[i][j+1]的大小(表示hor,ros匹配的最少次數);

等價於比較dp[i][j]和dp[i][j+1]+1的大小;dp[i][j+1]+1中的1可以看做hor匹配ro,最後加上乙個s;有沒有發現是等於dp[i][j]的;但這不一定是最優解

所以dp[i][j+1]+1>=dp[i][j];

同理我們比較dp[i][j]和dp[i-+1][j]+1的大小;我的1可以看做刪除hors後面的s,這消耗乙個操作,就等價於dp[i][j]了;

所以dp[i+1][j]+1>=dp[i][j];

所以壓根不需要比較,此時可以直接得出dp[i+1][j+1]==dp[i][j];

2---當str1[i+1]=str2[j+1]時,就等於給的例子中,匹配horse和ros時;

dp[i+1][j+1]=1+;

同樣的----

dp[i][j]表示hors,ro匹配的最少次數,你管我怎麼匹配得到的,反正我現在已經得到ro了,那麼最後的e直接替換成s不就得了;

所以這裡的1代表的是替換操作;

dp[i][j+1]表示hors,ros匹配的最少次數,我都匹配完了,直接把剛加入的e給刪掉不就行了,所以1對應的是刪除操作;

dp[i+1][j]表示horse,ro匹配的最少次數,同樣的,我在最後再新增乙個s不就得了,所以這裡1對應的是插入操作;

後兩種情況其實和上面第一種情況分析一樣,唯一不同的是對dp[i][j]的分析;

dp[0][0]=0;

dp[0][i]=i;//表示i個插入操作

dp[i][0]=i;//表示i個刪除操作

修改後(我還是很無語,好像同乙個答案每次提交結果不是一樣的,相差幾ms,但這卻足以讓單題排名差距很大hhh)

記憶體消耗這塊我用兩個等長陣列代替了二維陣列hhh,很多題目都可以這樣做。。。

Leetcode 72 編輯距離

給定兩個單詞 word1 和 word2,計算出將 word1 轉換成 word2 所使用的最少運算元 你可以對乙個單詞進行如下三種操作 插入乙個字元 刪除乙個字元 替換乙個字元 示例 1 輸入 word1 horse word2 ros 輸出 3 解釋 horse rorse 將 h 替換為 r ...

leetcode 72 編輯距離

給定兩個單詞 word1 和 word2,計算出將 word1 轉換成 word2 所使用的最少運算元 你可以對乙個單詞進行如下三種操作 插入乙個字元 刪除乙個字元 替換乙個字元 示例 1 輸入 word1 horse word2 ros 輸出 3解釋 horse rorse 將 h 替換為 r r...

LeetCode72 編輯距離

給定兩個單詞 word1 和 word2,計算出將 word1 轉換成 word2 所使用的最少運算元 你可以對乙個單詞進行如下三種操作 示例 1 輸入 word1 horse word2 ros 輸出 3 解釋 horse rorse 將 h 替換為 r rorse rose 刪除 r rose ...