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

/* 题目描述 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)