問題描述:給定兩個字串,編寫程式獲取兩個字串之間最長公共子串的長度。例如字串s1="gccctagccagde",字串s2="gcgccagtgde",這兩個字串的最長公共子串就是「gccag」,其長度為5。
這是來自別人的部落格的乙個問題。http://
假設這句話是對的。那麼s2裡的子字串一定會在s1裡出現。那麼s2一定是較短的乙個。
別人的部落格裡寫了一些方法。比如把所有的字串取出逐個比較。所有我覺得用資料庫來做比較快。
問題1.
如果單個字元匹配我覺得是很快就能找到的。比如我們找到了a的位置。那麼a開頭的字串都在這些位置開始。那麼a就在s1中匹配兩次。這樣一次分詞就 能把所有的字元位置寫出來。得到這樣兩個個集合,比如setaz。setbz。做交叉運算。乙個字母當然不如兩個字母快,如果4位元表示乙個字母的話。那麼64位不是可以表示16個字元嗎
。當16個字元完全匹配的時候。我們覺得單次匹配速度會快一些。當1到16個字元都可以匹配時,第17個字元開始的下個字元。也可在setaz裡面找到。當只匹配了15個字元時候,也是成功的,同時也要把這15個長的字串加入到setaz裡面,萬一還有這樣的呢。那這樣的話。更多個字元放在一起不是更好嘛。所以有了加入過程。也就有了刪除過程。
問題2.
也可以這樣。生成兩個自動機。
問題3.
使s1字串收斂。比如連續的c記錄為乙個c。兩個字串之間比配。這樣匹配上的都是子串。當s1的某段字串包括了所有可能字元的時候。我們稱為一次分組。每組對s2做比較。當每次比較失敗後向右滑動。產生可能匹配。
問題4.
如果記錄abbc為乙個正序,ba為乙個逆序。這樣的話。在每個位元組8位元的條件下。符號位記錄了0或1,後面7位記錄了連續長度。連續數個記錄為乙個序列,這樣的話,s1就形成了乙個01的序列,同樣s2也是這樣的01序列,但同樣的序列比如同為0100的時候,我們認為是可能匹配。當然,還要比較字串長度。
問題5.
求兩個字串的最長公共子串
問題 有兩個字串str和str2,求出兩個字串中最長公共子串長度。比如 str acbcbcef,str2 abcbced,則str和str2的最長公共子串為bcbce,最長公共子串長度為5。演算法思路 1 把兩個字串分別以行和列組成乙個二維矩陣。2 比較二維矩陣中每個點對應行列字元中否相等,相等的...
求兩個字串的最長公共子串
def longestcommonsequence str one,str two,case sensitive true str one 和 str two 的最長公共子串行 param str one 字串1 param str two 字串2 正確結果 param case sensitive...
求解兩個字串的最長公共子串
求解兩個字串的最長公共子串 比如字串1 helloworld 字串2 hloop 則這兩個字串的最長公共子串行長度為2,最長公共子串行是 lo 問題定義 lcs i j 為以s1 i 與s2 j 為結尾的的最長公共子串的長度 遞推公式 lcs xn,ym lcs xn 1,ym 1 1 if x n...