前言
最長公共串是編輯距離與最長公共子序列的基礎,而編輯距離與最長公共子序列應用之處非常廣泛。
在單詞的和詞彙的校驗是否正確中,會使用到編輯距離;最長公共子序列算法在文本的diff算法,git和svn中比較代碼修改前後的差異,兩個文本的相似度計算使用最長公共子序列計算將更加準確,能夠保留更多的信息(餘弦夾角只能根據詞頻計算)。在多數的算法解釋中,都僅僅是提供公式和代碼;他們的代碼和公式很容易記住。學習是一個理解的過程,不然只會拿着它解決特定問題,而不能進行擴展。
最長公共串
字符串strA = "acasdef"
和字符串strB = "aasdefd"
;容易得出最長公共串的asdef。
最長公共串是計算兩個字符串中連續的 、最長的 、相同的 字符串。
行和列相互比較,如果不相等使用0 進行填充,如果相等 取得 左上方的值加1 填充此位置;
根據如下圖的矩陣排列,第二行與第一列的a從第一列開始,依次與第二列比較,直到最後一列。這種排列過程形如,a依次與字符串acasdef
進行比較。同理第一行第二列的a,依次從第一行開始,然後第二行第二列a,就相當於a與字符串aasdefd
進行比較。
查看一下左上方是什麼意思;比如:下圖中數字2的左邊就是橫軸字符退一格,由原來的acas變成aca ;數字2的上方就是縱軸字符退一個,由原來的aas變成aa 。那麼就容易得出了,左上方就是當前橫軸strA和縱軸strB字符串的前一個字符。
可能不好理解,我們再來整一個圖;看綠色背景的對角線的字符,其實就是橫軸的ac 與 縱軸的as;藍色背景的其實就是 sdef與aasd,那麼橘黃色背景也很容易得出 def 與 efd 了;兩個灰色背景的對角分別是 defd 與acas比較,defd 與 asde。
那麼我們得出結論,字符串strA = "acasdef"
和字符串strB = "aasdefd"
,可以出現任何長度的比較。而且先前的 比較的值 已經保存在對應的位置中,那麼下次再進行別的位置比較時,若需要用到之前的值,拿來使用即可;這種方法美其名曰動態規劃。