3.3_
計算字串的相似度
和計算兩字串的最長公共子串行相似。
設ai為字串a(a1a2a3 … am)的前i個字元(即為a1,a2,a3 … ai)
設bj為字串b(b1b2b3 … bn)的前j個字元(即為b1,b2,b3 … bj)
設l(i , j)為使兩個字串和ai
和bj相等的最小操作次數。
當ai等於bj
時 顯然l(i, j)=l(i-1, j-1)
當ai不等於bj時
若將它們修改為相等,則對兩個字串至少還要操作l(i-1, j-1)次
若刪除ai
或在bj
後新增ai
,則對兩個字串至少還要操作l(i-1, j)次
若刪除bj
或在ai
後新增bj
,則對兩個字串至少還要操作l(i, j-1)次
此時l(i, j)=min( l(i-1, j-1), l(i-1, j), l(i, j-1) ) + 1
顯然,l(i, 0)=i,l(0, j)=j, 再利用上述的遞推公式,可以直接計算出l(i, j)值。
為了保持與書中**一致,下面的函式引數型別是string,而不是char*。
由於只要求計算兩字串的距離,計算時,只用到兩列資料,因而可以對**進一步優化,節省空間。
上面的**還可進一步優化,比如通過指標而不是陣列名來訪問記憶體。如果記憶體足夠大,可以多申請空間,每次迴圈,通過修改儲存的資料起始位置,避免記憶體複製。
《程式設計之美》讀書筆記
程式設計之美 讀書筆記 一 中國象棋將帥問題 程式設計之美 讀書筆記 二 求二進位制數中1的個數 擴充套件問題 程式設計之美 讀書筆記 三 一摞烙餅的排序問題 程式設計之美 讀書筆記 四 買書折扣問題的貪心解法 程式設計之美 讀書筆記 五 飲料 問題 程式設計之美 讀書筆記 六 連連看遊戲設計 程式...
程式設計之美3 3 計算字串的相似度
問題 1.計算兩個字串的最長公共子串行 lcs 且公共子串行在字串中不需要是連續的。2.計算兩個字串的距離,完全相同的字串距離為0,可以通過修改乙個字元 增加乙個字元或刪除乙個字元三種方式來使兩個字串相同,但這些方式會使得距離加1。1.解法 這兩個問題的解法基本相同,都是二維的動態規劃,都考慮字串的...
程式設計之美 3 3 計算字串的相似度
1.簡述 使用兩個字串之間的編輯距離計算它們的相似度,相似度 1 編輯距離 1 兩個字串的編輯距離 指通過下面三種操作可以將兩個字串變為相同的字串需要的次數。1 修改乙個字元 2 增加乙個字元 3 刪除乙個字元。對於 abcdefg 和 abcdef 兩個字串來說,我們認為可以通過增加 減少乙個 g...