經(jīng)典算法之編輯距離算法

前言

最近翻開之前一本工作筆記夸赫,回想起之前做一個搜索功能,其中有用到計算相似度時用過編輯距離算法。記得也是leetcode hard難度诉瓦,本文權(quán)當個回顧吧。

簡介

Levenshtein距離力细,用于計算兩個字符串之間的編輯距離睬澡。編輯距離的一種。是指兩個字符串之間眠蚂,由一個轉(zhuǎn)換成另一個所需的最少編輯操作次數(shù)煞聪。算法概念是俄羅斯科學家弗拉基米爾·萊文斯坦(Levenshtein · Vladimir I)于1965年提出。允許的編輯操作包括:替換逝慧、插入昔脯、刪除啄糙。

算法實現(xiàn)

1. 設(shè)定dp數(shù)組意義

dp[i][j]代表的意思為:以i - 1為結(jié)尾的字符串w1和以j - 1為結(jié)尾的字符串w2,最近的編輯距離記為dp[i][j]云稚。

2. 推導過程

比較w1在i - 1位置和w2在j - 1位置的字符隧饼,分為兩種情況。

1. 不等
  • 插入
    例如w1 = "ab", w2 = "bca"静陈。
    ??若在w1上加字符:為了使使w[i - 1]與w2[j - 1]字符相等燕雁,那么就需要在w1的i - 1位置插入一個"b",w1的長度增加1鲸拥。也就是說此時以i-2為結(jié)尾的w1和以j-1位結(jié)尾的w2的最近編輯距離增加了一個插入操作贵白。
    即 dp[i][j]= dp[i - 1][j] + 1;
    ??若在w2上加字符:使w[i - 1]與w2[j - 1]相同,那么就需要在w2的j - 1位置插入一個"a"崩泡,w2的長度增加1禁荒。也就是說此時以i - i為結(jié)尾的w1和以j - 2位結(jié)尾的w1的最近編輯距離增加了一個插入操作。
    即 dp[i][j]= dp[i][j - 1] + 1;

  • 替換
    w1替換w1[i - 1]角撞,使其與word2[j - 1]相同呛伴,那么以下標i - 2為結(jié)尾的w1與i - 2為結(jié)尾的w2的最近編輯距離加一個替換字符的操作。
    即 dp[i][j] = dp[i - 1][j - 1] + 1;

  • 刪除
    刪除與插入其實所需要的操作數(shù)是一樣的谒所。在w1上刪除一個字符热康,等同于在w2上插入一個字符的操作數(shù)。

以上三種操作劣领,取最少編輯距離即:dp[i][j] = min({dp[i - 1][j], dp[i][j - 1], dp[i - 1][j - 1]}) + 1;

2. 相等

若w1[i - 1] == w2[j - 1]姐军,無需編輯。
即 dp[i][j] = dp[i - 1][j - 1];

通過以上兩種情況尖淘,可推導出動態(tài)轉(zhuǎn)移方程:
dp[i][j]=\left\{\begin{array}{ll} dp[i-1][j-1] & \ word1[i]= word2[j] \\\\ min (dp[i-1][j], \ dp[i-1][j-1], \ dp[i][j-1])+1 & \ word1[i] \neq word2[j] \end{array}\right.

邊界情況:
一個空串和一個非空串的編輯距離為dp[i][0] = i和dp[0][j] = j奕锌,dp[i][0]相當于對w1執(zhí)行i次刪除操作,dp[0][j]相當于對w1執(zhí)行j次操作村生。

class Solution {
public:
    int minDistance(string word1, string word2) {
        int size1 = word1.size(), size2 = word2.size();
        vector<vector<int>> dp(size1 + 1, vector<int>(size2 + 1, 0));
        for (int i = 0; i <= size1; i++) {
            dp[i][0] = i;
        }

        for (int i = 0; i <= size2; i++) {
            dp[0][i] = i;
        }

        for (int i = 1; i <= size1; i++) {
            for (int j = 1; j <= size2; j++) {
                if (word1[i - 1] == word2[j - 1]) {
                    dp[i][j] = dp[i - 1][j - 1];
                }else {
                    dp[i][j] = min({dp[i][j - 1], dp[i - 1][j - 1], dp[i - 1][j]}) + 1;
                }
            }
        }
        return dp[size1][size2];
    }
};

其他

  1. 用戶的一些輸入模糊匹配惊暴。如Elasticsearch的Fuzzy query。
  2. 如果某場景要求string的前部分越相似分數(shù)越高趁桃。例如對于計算"12A45"辽话,"12345A"和"12345"的Levenshtein距離值是相同的。此時可用Jaro–Winkler distance卫病。Jaro-Winkler distance會給起始部分就相同的字符串更高的分數(shù)油啤。有興趣的小伙伴可以去google下具體實現(xiàn)。

其他算法詳解

其他算法詳細題解

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蟀苛,一起剝皮案震驚了整個濱河市益咬,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌屹逛,老刑警劉巖础废,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件汛骂,死亡現(xiàn)場離奇詭異,居然都是意外死亡评腺,警方通過查閱死者的電腦和手機帘瞭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蒿讥,“玉大人蝶念,你說我怎么就攤上這事∮蟪瘢” “怎么了媒殉?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長摔敛。 經(jīng)常有香客問我廷蓉,道長,這世上最難降的妖魔是什么马昙? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任桃犬,我火速辦了婚禮,結(jié)果婚禮上行楞,老公的妹妹穿的比我還像新娘攒暇。我一直安慰自己,他們只是感情好子房,可當我...
    茶點故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布形用。 她就那樣靜靜地躺著,像睡著了一般证杭。 火紅的嫁衣襯著肌膚如雪田度。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天躯砰,我揣著相機與錄音每币,去河邊找鬼。 笑死琢歇,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的梦鉴。 我是一名探鬼主播李茫,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼肥橙!你這毒婦竟也來了魄宏?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤存筏,失蹤者是張志新(化名)和其女友劉穎宠互,沒想到半個月后味榛,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡予跌,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年搏色,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片券册。...
    茶點故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡频轿,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出烁焙,到底是詐尸還是另有隱情航邢,我是刑警寧澤,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布骄蝇,位于F島的核電站膳殷,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏九火。R本人自食惡果不足惜秽之,卻給世界環(huán)境...
    茶點故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望吃既。 院中可真熱鬧考榨,春花似錦、人聲如沸鹦倚。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽震叙。三九已至掀鹅,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間媒楼,已是汗流浹背乐尊。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留划址,地道東北人扔嵌。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像夺颤,于是被迫代替她去往敵國和親痢缎。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,592評論 2 353

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