兩個字串的最長公共子串
DP的方式求解:
#include <iostream>
using namespace std;
#define M 9
#define N 11
//如果動態傳進m和n的話,陣列lcs賦值只能通過指標,這樣太麻煩
int lcs[M][N];
/**
* 最長公共子串(LCS)
* 狀態轉移方程:
* f(i,j) =
0 a[i] != b[j]
f(i-1,j-1)+1 a[i] == b[j]
其中f(i,j)表示串A以a[i]結尾與串B以b[j]結尾的最長公共子串
* 優化: 這裡時間和空間都是O(M*N)。
* 注意到我們自底向上求解lcs[m][n]的時候,其實是
* 逐行求解的。每行只依賴於上一行的值,所以我們其實可以利用
* “滾動陣列”來優化這個DP解法的空間到O(N)。
*/
char *lcs1(char *a, char *b){
int a_len = M,b_len = N;
char *p;
int i,j;
int max = 0, end_y;
//初始化二位陣列的第0列
p = a;
for(i=0;i<a_len;i++){
if(a[i] == b[0]) lcs[i][0] = 1;
else lcs[i][0] = 0;
}
//初始化二維陣列的第0行
p = b;
for(j=0;j<b_len;j++){
if(b[j] == a[0]) lcs[0][j] = 1;
else lcs[0][j] = 0;
}
/**
* 核心部分:一行一行地自底向上求解
*/
for(i=1;i<a_len;i++)
for(j=1;j<b_len;j++){
//相同,則公共長度lcs[i][j]=lcs[i-1][j-1]+1
if(*(a+i) == *(b+j)){
lcs[i][j] = lcs[i-1][j-1] + 1;
//記錄最大長度的橫座標
if(lcs[i][j] > max){
max = lcs[i][j];
end_y = i;
}
}
//不同,公共長度為0
else{
lcs[i][j] = 0;
}
}
//輸出lcs矩陣
for(i=0;i<a_len;i++){
for(j=0;j<b_len;j++){
cout<<lcs[i][j];
}
cout<<endl;
}
//將公共子串(從a串中取)放入新空間並返回
p = (char *)malloc(sizeof(char)*(max+1));
j = 0;
for(i = end_y-max+1;i<=end_y;i++){
*(p+j) = a[i];
j++;
}
*(p+j) = '\0';
return p;
}
int main(){
char *a = "ackonpbee";
char *b = "dcaconpbexx";
cout<<"lcs:"<<lcs1(a,b)<<endl;;
return 0;
}
相關文章
- 字串篇(python)—兩個字串的最長公共子序列字串Python
- lCS(最長公共子串)
- poj 2774 求兩字串的最長公共子串 字尾陣列字串陣列
- 線性dp:最長公共子串
- poj3080-kmp+列舉子串 求最長公共子串KMP
- 最長子串
- [演算法筆記]動態規劃之最長公共子串和最長公共子序列演算法筆記動態規劃
- 最長公共子串 二維陣列 Go實現陣列Go
- 【谷歌面試題】找出字串中只包含兩種字元的最長子串谷歌面試題字串字元
- 演算法-兩最長迴文子串演算法
- 求字串中不含重複字元的最長子串字串字元
- 牛客網 Coincidence(最長公共子串LCS板題)IDE
- 最長公共子序列
- 演算法之字串——最長迴文子串演算法字串
- 牛客題霸 [最長公共子串]C++題解/答案C++
- 計算兩個字串最大公有子串字串
- Leetcode[字串] 5. 最長迴文子串LeetCode字串
- 翻譯數字串;及最長迴文子串分析字串
- 淺談最長迴文子串求法——字串雜湊字串
- 最長公共子序列(JAVA)Java
- L2-008 最長對稱子串【最長迴文字串】字串
- (字串雜湊表)找到字串中不重複出現字元的最長子串長度字串字元
- java 最長迴文子串Java
- python 動態規劃(揹包問題和最長公共子串)Python動態規劃
- 無重複字元的最長子串字元
- 最長公共子序列&迴文字串 nyoj動態規劃字串動態規劃
- POJ 3294 Life Forms(字尾陣列求k個串的最長子串)ORM陣列
- java 實現 最長公共子序列Java
- 最長公共子序列求方案數
- 線性dp:最長公共子序列
- java無重複字元的最長子串Java字元
- 3 無重複字元的最長子串字元
- 最長公共子序列的程式碼實現
- 演算法之字串——最長公共字首演算法字串
- 演算法練習:求字串的最長重複子串(Java實現)演算法字串Java
- “最長公共字串子序列”問題的動態規劃法演算法字串動態規劃演算法
- 動態規劃-最長公共子序列動態規劃
- 動態規劃——最長公共子序列動態規劃