最長公共字串(非連續)
先考慮二維,複雜度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...