POJ - 3080 Blue Jeans 字符串 暴力求最长公共连续子序列

时间:2019-01-17
本文章向大家介绍POJ - 3080 Blue Jeans 字符串 暴力求最长公共连续子序列,主要包括POJ - 3080 Blue Jeans 字符串 暴力求最长公共连续子序列使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

POJ - 3080 Blue Jeans

题意:

给定一些字符串求最长公共连续子序列(子序列长度必须大于3),符合条件就输出这个连续子序列(如果存在多个长度相同的连续子序列就输出字典序最小的那个),否则就输出 no significant commonalities 

思路:

按字符串长度从大到小暴力枚举第一个字符串的所有大于3的连续子序列,并检查其他字符串中是否含有这段连续子序列

这里需要用到几个函数:memcpy     strstr    strcmp   strcpy  

刚知道 puts() 中自带换行符。。。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
char s[11][100];
char a[100];  //存放临时 连续最长子序列
char b[100];  //存放最长连续子序列
int main()
{
    int m,n;
    scanf("%d",&m);
    while(m--)
    {
        scanf("%d",&n);
        for(int i=0;i<n;i++)
            scanf("%s",s[i]);
            memset(b,0,sizeof(b)); //初始化为空字符串
        int k,flag = 0;
        for(int i=60;i>2;i--)   //子串的长度
        {

            for(int j=0;j<61-i;j++) //子串的起始点
            {
                memset(a,0,sizeof(a));  //初始化为空字符串
                memcpy(a,s[0]+j,i*sizeof(char));  // 将以s[0][j]为起点的i个字符复制给a
                for(k=1;k<n;k++)
                {
                    if( strstr(s[k],a)==NULL )  //检验s[k]中是否含有连续序列 a
                        break;
                }
                if(k==n)  // 全部字符串中都含有连续序列 a
                {
                    flag = 1;
                    if(b[0]=='\0')    //第一次找到长度为 i 的连续子序列  直接复制      
                        strcpy(b,a);
                    else           //如果两连续子序列长度相同  把字典序小的复制给 b
                    {
                        if(strcmp(a,b)<0)
                            strcpy(b,a);
                    }
                }
            }
            if(flag)   //如果找到连续子序列就跳出循环
                break;
        }
        if(!flag)
            printf("no significant commonalities\n");
        else
            puts(b);  // 自带换行符
    }
    return 0;
}