Leetcode - Edit Distance

Screenshot from 2016-02-01 22:18:11.png

My code:

public class Solution {
    public int minDistance(String word1, String word2) {
        if (word1 == null || word2 == null)
            return -1;
        else if (word1.length() == 0)
            return word2.length();
        else if (word2.length() == 0)
            return word1.length();
        else if (word1.equals(word2))
            return 0;
        
        int len1 = word1.length();
        int len2 = word2.length();
        /** dp[i][j] means the distance between word1[0, 0 + len1) and word2[0, 0 + len2) */
        int[][] dp = new int[len1 + 1][len2 + 1];
        for (int i = 0; i <= len1; i++)
            dp[i][0] = i;
        for (int i = 0; i <= len2; i++)
            dp[0][i] = i;
        
        for (int i = 1; i <= len1; i++) {
            for (int j = 1; j <= len2; j++) {
                char c1 = word1.charAt(i - 1);
                char c2 = word2.charAt(j - 1);
                if (c1 == c2) {
                    dp[i][j] = dp[i - 1][j - 1];
                }
                else {
                    int delete = dp[i - 1][j] + 1;
                    int insert = dp[i][j - 1] + 1;
                    int replace = dp[i - 1][j - 1] + 1;
                    dp[i][j] = Math.min(delete, Math.min(insert, replace));
                }
            }
        }
        
        return dp[len1][len2];
    }
}

這道題木既昨天 scramble string之后,再次刷新我三觀逐样。蜗字。打肝。
DP就像是一臺參透天地規(guī)則的機(jī)器。放在那里跑挪捕。雖然笨粗梭,慢,但是级零,最終結(jié)果断医,
一定會出來!
一定是正確的奏纪!
就是是圖靈機(jī)鉴嗤。就像那部電影里破譯電報密碼的機(jī)器。
雖然笨重序调,落后醉锅,但是,結(jié)果一定會出來炕置。
說了這么多荣挨,實在是感嘆DP的偉大。
雖然也知道做他的思路朴摊。但是默垄,真的想不出
dp[i][j] 的具體物理意義。這真的是思維高度不同甚纲。
這道題目口锭。
dp[i][j] 表示 word1.substring(0, i) and word2.substring(0, j) 的distance
即word1從開頭,長度為i的子串介杆,和word2從開頭鹃操,長度為j的子串,之間的distance春哨。
dp[i][j]
所以荆隘,
dp[0][j] = j
dp[i][0] = i
假設(shè)現(xiàn)在一個長度分別為 i, j 的子串。那么赴背,
dp[i][j] 等于多少呢椰拒?
或者說,他可以由哪幾個變化得到呢凰荚?
三個燃观,
delete, insert, replace
假設(shè), c1 = word1.charAt(i); c2 = word2.charAt(j);
if c1 == c2 -> dp[i][j] = dp[i - 1][j - 1];
即便瑟,word1[0, i - 1) 變化到 word2[0, j - 1) 的步數(shù)
與 word1[0, i) 變化到 word2[0, j)的步數(shù)相同缆毁。 因為末尾字母相同。
這也是變化最小的步數(shù)到涂。

if c1 != c2
那么脊框,就需要多點變化了颁督。三種變化,上面說了缚陷。
假設(shè)末尾字母分別是 x适篙, y
-------x
-----------y
如果是delete
要從word1變到word2,那么把x刪除箫爷,再從word1[0, i - 1) 變到 word2[0, j)
所以,delete變化需要的步數(shù)聂儒,
delete = dp[i - 1][j] + 1;

如果是insert
那么虎锚,在word1末尾,插入y衩婚,或者說窜护,
先將 word1[0, i) 變到word2[0, j - 1), 然后word1末尾再插入y,就行了非春。
所以柱徙,insert變化需要的步數(shù),
insert = dp[i][j - 1] + 1;

如果是replace奇昙,直接把x換成y护侮,
所以,replace變化需要的步數(shù)储耐,
replace = dp[i - 1][j - 1] + 1;

然后找出 這三個步驟操作的步數(shù)中的最小值羊初,作為dp[i][j]
然后一步步往下走。

參考網(wǎng)頁:
http://www.programcreek.com/2013/12/edit-distance-in-java/

真的想不出來什湘。长赞。

Anyway, Good luck, Richardo!

My code:

public class Solution {
    public int minDistance(String word1, String word2) {
        if (word1 == null || word2 == null) {
            return -1;
        }
        
        int row = word1.length() + 1;
        int col = word2.length() + 1;
        
        int[][] dp = new int[row][col];
        for (int i = 1; i < row; i++) {
            dp[i][0] = i;
        }
        for (int i = 1; i < col; i++) {
            dp[0][i] = i;
        }
        
        for (int i = 1; i < row; i++) {
            for (int j = 1; j < col; j++) {
                int delete = dp[i][j - 1] + 1;
                int add = dp[i - 1][j] + 1;
                int replace = dp[i - 1][j - 1];
                if (word1.charAt(i - 1) != word2.charAt(j - 1)) {
                    replace += 1;
                }
                dp[i][j] = Math.min(delete, Math.min(add, replace));
            }
        }
        
        return dp[row - 1][col - 1];
    }
}

還是靠自己做出來了,感覺和 wildcard matching 很類似
-----i
------j

  1. delete: dp[i - 1][j] + 1, delete i
  2. add: dp[i][j - 1] + 1, add i + 1 = j
  3. replace: dp[i - 1][j - 1] + i == j ? 0 : 1, replace j with i if necessary

Anyway, Good luck, Richardo闽撤! -- 08/17/2016

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末得哆,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子哟旗,更是在濱河造成了極大的恐慌贩据,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件热幔,死亡現(xiàn)場離奇詭異乐设,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)绎巨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進(jìn)店門近尚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人场勤,你說我怎么就攤上這事戈锻〖吒” “怎么了?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵格遭,是天一觀的道長哈街。 經(jīng)常有香客問我,道長拒迅,這世上最難降的妖魔是什么骚秦? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮璧微,結(jié)果婚禮上作箍,老公的妹妹穿的比我還像新娘。我一直安慰自己前硫,他們只是感情好胞得,可當(dāng)我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著屹电,像睡著了一般阶剑。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上危号,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天牧愁,我揣著相機(jī)與錄音,去河邊找鬼葱色。 笑死递宅,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的苍狰。 我是一名探鬼主播办龄,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼淋昭!你這毒婦竟也來了俐填?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤翔忽,失蹤者是張志新(化名)和其女友劉穎英融,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體歇式,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡驶悟,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了材失。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片痕鳍。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出笼呆,到底是詐尸還是另有隱情熊响,我是刑警寧澤,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布诗赌,位于F島的核電站汗茄,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏铭若。R本人自食惡果不足惜洪碳,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望奥喻。 院中可真熱鬧偶宫,春花似錦、人聲如沸环鲤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽冷离。三九已至,卻和暖如春纯命,著一層夾襖步出監(jiān)牢的瞬間西剥,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工亿汞, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留瞭空,地道東北人。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓疗我,卻偏偏與公主長得像咆畏,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子吴裤,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,786評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 背景 一年多以前我在知乎上答了有關(guān)LeetCode的問題, 分享了一些自己做題目的經(jīng)驗旧找。 張土汪:刷leetcod...
    土汪閱讀 12,724評論 0 33
  • thiele插值算法 1點插值算法 function [C,c]=thiele(X,Y,Z)%X為插值點橫坐標(biāo),Y...
    00crazy00閱讀 1,971評論 0 4
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法麦牺,類相關(guān)的語法钮蛛,內(nèi)部類的語法,繼承相關(guān)的語法剖膳,異常的語法魏颓,線程的語...
    子非魚_t_閱讀 31,581評論 18 399
  • 動態(tài)規(guī)劃(Dynamic Programming) 本文包括: 動態(tài)規(guī)劃定義 狀態(tài)轉(zhuǎn)移方程 動態(tài)規(guī)劃算法步驟 最長...
    廖少少閱讀 3,256評論 0 18
  • 這個問題其實并不難甸饱,就兩點:一個是你有沒有用對方法,還一個就是你有沒有堅持。 發(fā)騷客在這就給大家推薦以下9個瘦腿的...
    f69b661ee123閱讀 28,300評論 84 2,027