您的位置:首页 > 编程语言 > C语言/C++

C++ 关于最长公共子串问题

2016-03-09 19:15 204 查看
/*
题目描述 Description
人类基因组计划在人类基因中截获了两个DNA序列,序列A和B,规定两个序列所隐藏的遗传信息就是两者的最长公共子串(注意,这里的子串是指连续的,比如说ABCDEFG中ABC是ABCDEFG的子串,而ABD或者ABE都不是ABCDEFG的子串),现在,你需要找出其中所有的遗传信息(即最长公共子串)以及遗传信息的个数。

输入描述 Input Description
输入两个字符串A,B

输出描述 Output Description
输出N个最长公共子串,最长公共子串的个数

样例输入 Sample Input
21232523311324
31212322344511324

样例输出 Sample Output
21232
11324
2
*/
#include <iostream>
#include <cstring>  // strlen()函数的调用
using namespace std;

int main()
{
char str1[100],str2[100];   // 存储2个子串
int sco[100][100];          // **********
int len1,len2;              // 2个子串的长度
// max最长公共子串的个数 temp辅助变量(打印结果时)
、  // count最长公共子串字符个数
int i,j,max,temp,count;
cin>>str1>>str2;

count = 0;
max = 0;
len1 = strlen(str1);
len2 = strlen(str2);

for( i = 0; i  < len1; ++i )
for( j = 0; j < len2; ++j )
// 不同赋值0
if(str1[i] != str2[j]) sco[i][j] = 0;
else
{
// 若在第一行or第一列 则赋值1
if( i-1<0 || j-1<0 ) sco[i][j] = 1;
else
{
// 不在首行首列,赋值为左上角元素+1
sco[i][j] = sco[i-1][j-1] + 1;
// 记录公共子串最大字符个数
if(sco[i][j] > max) max = sco[i][j];
}
}

for( i = 0; i  < len1; ++i )
for( j = 0; j < len2; ++j )
if(sco[i][j] == max)
{
// 正序输出
// 最长公共子串的首字符的位
temp = i-max+1;
// 单字符正序输出max次
for(int m = 0; m < max; ++m )
{
cout<<str1[temp];
++temp;
}
cout<<endl;
++count;
}
cout<<count<<endl;  // 输出最长公共子串的个数
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++ BlueBridge