最長公共子串行針對小字符集的演算法

2022-08-12 11:27:16 字數 987 閱讀 3322

一般對於兩個字串,長度分別為n和m,其時間複雜度為o(nm)。

但是針對小字符集的情況,可以把複雜度降低到o(n^2+km),其中n為兩個字串較短的長度。這種方法對於兩個字串長度相差很大的情況比o(nm)要優化很多。

就假設所有的字元都是小寫字母,這樣就符合小字符集的前提了。設較短的字串為s1,較長的字串為s2。字串下標從1開始。

s2字串每個位置右邊第乙個字元是可以通過o(km)預處理得到的。其中k為小字符集的字元個數,m為較長的那個字串的長度。

用next[i][j]表示s2[i]右邊第乙個(char)('a'+j)的位置。

設dp[i][j]表示s1匹配了前i位,長度為j的最長公共子串行與s2匹配到的最靠左的位置。如果不存在則為length(s2)+1。

dp[i][0] = 0

如果s2的dp[i-1][j-1]這個位置右邊第乙個與s1[i]相等的位置存在,那麼dp[i][j] = min。

否則dp[i][j] = dp[i-1][j]。

對於每乙個不是-1的dp,記錄下j,最後取乙個最大就是最長公共子串行了。

因此,總的複雜度為o(n^2+km)。

具體實現:

#include#include#includeusing namespacestd;

const int inf=0x3f3f3f3f;

const int maxn=1005;

const int maxm=1000005;

chars1[maxn],s2[maxm];

intdp[maxn][maxn];

int next[maxm][26];

intmain()

}for (int i=1;i<=l1;i++) dp[i][0]=0;

int ans=0;

for (int i=1;i<=l1;i++)

}printf("%d\n",ans);

return 0;

}

最長公共字串和最長公共子串行

給出兩個字串,找到最長公共子串,並返回其長度。建立乙個矩陣來儲存兩個字串出現相同字元的地方,比如 abccd 和 abcefc 就有 abccd a10000 b02000 c00300 e00040 f00000 c00100 這樣就有每次遇到相等的都加上下他的斜上方的位置的值,然後使用乙個max...

字串中最長公共子串行和最長公共子串

例 bdcaba和abcbdab,最長公共子串行為 bcba。dp解法 字串1的長度為length1,字串2的長度為length2,建立乙個二維陣列c length1 length2 用來記錄最長公共子串行的長度,狀態轉移方程為 整個狀態轉移以及二維陣列矩陣c為 生成字串長度加1的0矩陣,m用來儲存...

字串的最長公共子串行

審題 最長公共子串行 longest common subsequence,簡稱 lcs 是一道非常經典的面試題目,因為它的解法是典型的二維動態規劃,大部分比較困難的字串問題都和這個問題乙個套路,比如說編輯距離。而且,這個演算法稍加改造就可以用於解決其他問題,所以說lcs演算法是值得掌握的。所謂子串...