參考自 <<
題目描述
給出兩個字串,求兩個字串的最長公共字串。
輸入
abcfbc abfcab
programming contest
abcd mnp
輸出
4 2
0分析
可以看出:
f[i][j]=f[i-1][j-1]+1;(a[i]==b[j])
f[i][j]=max(f[i-1][j],f[i][j-1])(a[i]!=b[j]);
n由於f(i,j)只和f(i-1,j-1), f(i-1,j)和f(i,j-1)有關, 而在計算f(i,j)時, 只要選擇乙個合適的順序, 就可以保證這三項都已經計算出來了, 這樣就可以計算出f(i,j). 這樣一直推到f(len(a),len(b))就得到所要求的解了.
**
#include
#include
#include
#include
#include
using
namespace
std;
int dp[1100][1100];
char s1[1000],s2[1000];
int main()
}printf("%d\n",dp[len1][len2]);
}return
0;}
給出兩個字串,求兩個字串的最長公共字串及列印公共子串
輸入
abcfbc abfcab
programming contest
abcd mnp
輸出
lcs=4
a b c b
lcs=2
o n
lcs=0
**
#include
#include
#include
#include
#include
using
namespace
std;
int dp[110][110],path[110][110];
char s1[110],s2[110];
void lcs(int len1,int len2)
else
if(dp[i][j-1]<=dp[i-1][j])else}}
printf("lcs=%d\n",dp[len1][len2]);
}void print(int x,int y)
else
if(path[x][y]==2)else
if(path[x][y]==3)
}int main()
給定兩個字串,輸出兩個字串公共不重複部分。
輸入
輸出
**
將兩個字串結合起來,他們的公共子串只輸出一次。
根據lcs的原理,將每個字元都進行標記,看兩個字串中對應的字元究竟處於什麼狀態,然後輸出,其標記為公共子串的字元只輸出一次即可。
注意陣列的初始化。
#include
#include
#include
#include
#include
using namespace std;
int dp[110][110],path[110][110];
char s1[110],s2[110];
void lcs(int len1,int len2)
else
if(dp[i][j-1]<=dp[i-1][j])else}}
/*for(int i=1;i<=len1;i++)
printf("\n");
}printf("lcs=%d\n",dp[len1][len2]);
*/}void print(int
x,int
y)else
if(path[x][y]==2)else
if(path[x][y]==3)
}int main()
最長公共子串行問題 最長公共子串問題 動態規劃
longest common subsequence problem 序列x和y,找到z為x和y的最大公共子串行 蠻力列舉 從x的長度為1序列開始列舉,在y中查詢是否有該序列 列舉觀察,長度為x 1的子串行是長度為x的子串行的一部分 存在最優子結構和重疊子問題,適合動態規劃 1 問題結構分析 c i...
動態規劃 最長公共子串行問題(LCS)
若給定序列x 則另一串行z 是x的子串行 是指存在乙個嚴格遞增下標序列使得對於所有j 1,2,k有 zj xij。例如,序列z 是序列x 的子串行,相應的遞增下標序列為。給定2 個序列x和y 當另一串行z既是 x的子串行又是 y的子串行時,稱 z是序列x和 y的公共子串行。例如,序列x y 的子串行...
最長公共子串行(LCS)問題
問題描述 見演算法導論p208 p209 前提概念 給定乙個序列x x1,x2,xm 對i 0,1,m,記x的第i個字首為xi x1,x2,xi 故xm x,而x0是個空序列 乙個給定序列的子串行就是該序列去掉0個或多個元素 不一定連續 如bcdb是abcbdab的乙個子串行 基於以上定義,最長公共...