編輯距離--萊文斯坦距離

編輯距離:將一個字符串轉(zhuǎn)化成另一個字符串索昂,需要的最少編輯操作次數(shù)(比如增加一個字符、刪除一個字符扩借、替換一個字符)椒惨。編輯距離越大,說明兩個字符串的相似程度越谐弊铩康谆;相反,編輯距離就越小错洁,說明兩個字符串的相似程度越大秉宿。
萊文斯坦距離允許增加、刪除屯碴、替換字符這三個編輯操作描睦。萊文斯坦距離的大小,表示兩個字符串差異的大小

回溯法:如果 a[i] 與 b[j] 匹配导而,遞歸考察 a[i+1] 和 b[j+1]忱叭。
如果 a[i] 與 b[j] 不匹配,那我們有多種處理方式可選:
1.可以刪除 a[i]今艺,然后遞歸考察 a[i+1] 和 b[j]韵丑;
2.可以刪除 b[j],然后遞歸考察 a[i] 和 b[j+1]虚缎;
3.可以在 a[i] 前面添加一個跟 b[j] 相同的字符撵彻,然后遞歸考察 a[i] 和 b[j+1];
4.可以在 b[j] 前面添加一個跟 a[i] 相同的字符,然后遞歸考察 a[i+1] 和 b[j]实牡;
5.可以將 a[i] 替換成 b[j]陌僵,或者將 b[j] 替換成 a[i],然后遞歸考察 a[i+1] 和 b[j+1]创坞。

 private char[] a = "mitcmu".toCharArray();
    private char[] b = "mtacnu".toCharArray();
    private int n = 6;
    private int m = 6;
    // 存儲結果
    private int minDist = Integer.MAX_VALUE;

    // 調(diào)用方式 lwstBT(0, 0, 0);
    public void lwstBT(int i, int j, int edist) {
        if (i == n || j == m) {
            if (i < n) {
                edist += (n - i);
            }
            if (j < m) {
                edist += (m - j);
            }
            if (edist < minDist) {
                minDist = edist;
            }
            return;
        }
        // 兩個字符匹配
        if (a[i] == b[j]) {
            lwstBT(i + 1, j + 1, edist);
        } else { // 兩個字符不匹配
            // 刪除a[i]或者b[j]前添加一個字符
            lwstBT(i + 1, j, edist + 1);
            // 刪除b[j]或者a[i]前添加一個字符
            lwstBT(i, j + 1, edist + 1);
            // 將a[i]和b[j]替換為相同字符
            lwstBT(i + 1, j + 1, edist + 1);
        }
    }

動態(tài)規(guī)劃:
如果:a[i]!=b[j]碗短,那么:min_edist(i, j)就等于:
min(min_edist(i-1,j)+1, min_edist(i,j-1)+1, min_edist(i-1,j-1)+1)
如果:a[i]==b[j],那么:min_edist(i, j)就等于:
min(min_edist(i-1,j)+1, min_edist(i,j-1)+1题涨,min_edist(i-1,j-1)
其中偎谁,min表示求三數(shù)中的最小值总滩。

public int lwstDP(char[] a, int n, char[] b, int m) {
        int[][] minDist = new int[n][m];
        // 初始化第0行:a[0..0]與b[0..j]的編輯距離
        for (int j = 0; j < m; ++j) {
            //若相等。差為下標值巡雨。因為從0開始
            if (a[0] == b[j]) {
                minDist[0][j] = j;
            } else if (j != 0) {
                minDist[0][j] = minDist[0][j - 1] + 1;
            } else {
                minDist[0][j] = 1;
            }
        }
        // 初始化第0列:a[0..i]與b[0..0]的編輯距離
        for (int i = 0; i < n; ++i) {
            if (a[i] == b[0]) {
                minDist[i][0] = i;
            } else if (i != 0) {
                minDist[i][0] = minDist[i - 1][0] + 1;
            } else {
                minDist[i][0] = 1;
            }
        }
        // 按行填表
        for (int i = 1; i < n; ++i) {
            for (int j = 1; j < m; ++j) {
                if (a[i] == b[j]) {
                    minDist[i][j] =
                        min(minDist[i - 1][j] + 1, minDist[i][j - 1] + 1, minDist[i - 1][j - 1]);
                } else {
                    minDist[i][j] = min(minDist[i - 1][j] + 1, minDist[i][j - 1] + 1, minDist[i - 1][j - 1] + 1);
                }
            }
        }
        return minDist[n - 1][m - 1];
    }

    private int min(int x, int y, int z) {
        int minv = Integer.MAX_VALUE;
        if (x < minv) { minv = x; }
        if (y < minv) { minv = y; }
        if (z < minv) { minv = z; }
        return minv;
    }
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末闰渔,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子鸯隅,更是在濱河造成了極大的恐慌澜建,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,000評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蝌以,死亡現(xiàn)場離奇詭異,居然都是意外死亡何之,警方通過查閱死者的電腦和手機跟畅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來溶推,“玉大人徊件,你說我怎么就攤上這事∷馕#” “怎么了虱痕?”我有些...
    開封第一講書人閱讀 168,561評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長辐赞。 經(jīng)常有香客問我部翘,道長,這世上最難降的妖魔是什么响委? 我笑而不...
    開封第一講書人閱讀 59,782評論 1 298
  • 正文 為了忘掉前任新思,我火速辦了婚禮,結果婚禮上赘风,老公的妹妹穿的比我還像新娘夹囚。我一直安慰自己,他們只是感情好邀窃,可當我...
    茶點故事閱讀 68,798評論 6 397
  • 文/花漫 我一把揭開白布荸哟。 她就那樣靜靜地躺著,像睡著了一般瞬捕。 火紅的嫁衣襯著肌膚如雪鞍历。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,394評論 1 310
  • 那天山析,我揣著相機與錄音堰燎,去河邊找鬼。 笑死笋轨,一個胖子當著我的面吹牛秆剪,可吹牛的內(nèi)容都是我干的赊淑。 我是一名探鬼主播,決...
    沈念sama閱讀 40,952評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼仅讽,長吁一口氣:“原來是場噩夢啊……” “哼陶缺!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起洁灵,我...
    開封第一講書人閱讀 39,852評論 0 276
  • 序言:老撾萬榮一對情侶失蹤饱岸,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后徽千,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體苫费,經(jīng)...
    沈念sama閱讀 46,409評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,483評論 3 341
  • 正文 我和宋清朗相戀三年双抽,在試婚紗的時候發(fā)現(xiàn)自己被綠了百框。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,615評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡牍汹,死狀恐怖铐维,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情慎菲,我是刑警寧澤嫁蛇,帶...
    沈念sama閱讀 36,303評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站露该,受9級特大地震影響睬棚,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜有决,卻給世界環(huán)境...
    茶點故事閱讀 41,979評論 3 334
  • 文/蒙蒙 一闸拿、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧书幕,春花似錦新荤、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,470評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至苟呐,卻和暖如春痒芝,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背牵素。 一陣腳步聲響...
    開封第一講書人閱讀 33,571評論 1 272
  • 我被黑心中介騙來泰國打工严衬, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人笆呆。 一個月前我還...
    沈念sama閱讀 49,041評論 3 377
  • 正文 我出身青樓请琳,卻偏偏與公主長得像粱挡,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子俄精,可洞房花燭夜當晚...
    茶點故事閱讀 45,630評論 2 359

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