最長公共字串(非連續)

2022-03-09 08:07:58 字數 981 閱讀 1869

最長公共字串(非連續)

先考慮二維,複雜度o(n*m),但是空間複雜度太高了,n如果》100000就憨臉了。

a[i][j]=a[i-1][j-1]+1(s[i]==s[j]),max(a[i-1][j],a[i][j-1]);

降低空間複雜度,考慮使用滾動陣列。

從轉移方程中可以看出,只會用到a[i-1][j-1],a[i-1][j],a[i][j-1]。現在考慮乙個問題,a[i-1][j-1]在計算a[i][j-1]時會被覆蓋掉,那我們只要在賦值之前先記錄下來就好了。

時間o(n*m),空間o(n)

#include#include

#include

#include

#include

#include

#include

#define inf 2147483647

#define for(i,a,b) for(register int i=a;i<=b;i++)

#define p(a) putchar(a)

#define g() getchar()

//by war

using

namespace

std;

intn,m;

char s1[10010],s2[10010

];int a[10010

];int

temp,k;

void

in(int &x)

while(c<='

9'&&c>='

0')x=x*10+c-'

0',c=g();

x*=y;

}void o(int

x)

if(x>9)o(x/10

); p(x%10+'0'

);}intmain()

}o(a[m-1

]);

return0;

}

最長公共字串

include include include include include customer.h using namespace std 最長公共字串 動態規劃 假設需要求得字串為str1,str2。函式f m,n 分別為 str1 m str2 n 結尾的公共字串長度。有以下遞推公式 遞推邊界...

最長公共字串

牛客網的題目鏈結 對於兩個字串,請設計乙個時間複雜度為o m n 的演算法 這裡的m和n為兩串的長度 求出兩串的最長公共子串的長度。這裡的最長公共子串的定義為兩個序列u1,u2,un和v1,v2,vn,其中ui 1 ui 1,vi 1 vi 1,同時ui vi。給定兩個字串a和b,同時給定兩串的長度...

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

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