pku 1226 Substrings

来源:互联网 发布:最优化算法第二版答案 编辑:程序博客网 时间:2024/05/18 00:41

转的:

题意:输入n个字符串,每个字符串的长度最多为100,要求求出这n个字符串的最长公共子串长度。(注意:假设这n个字符的最长公共子串为maxstr,则说每个字符串的的正序或逆序中只要其中一个有maxstr,就说明该字符含有maxstr).

思路:(1)先求这n个字符串中的最小长度字符串minstr.

      (2)再枚举公共子串的长度从len(minstr) 到 1,枚举所有可能的公共子串substr,再检查其它n -1个字符串中的正序或逆序串中是否有substr,如果满足,则返回长度len(substr),否则继续枚举,直到长度为0.

     (3)strstr, strncpy函数的应用很重要,大家可上网查相应的用法。

源代码:

#include<iostream>//此代码参考了网上资料
using namespace std;
const int MAXN =101;
charstr[MAXN][MAXN];
voidmy_strrev(char*str)
{
     int l, r;
     r =strlen(str);
     l = 0; r = r- 1;
     while(l <r) {
           char ch =str[l];
           str[l ++] =str[r];
           str[r --] =ch;
     }
}
intmax_substr(char*source, intn)
{
     int sublen =strlen(source);
     int sourcelen =strlen(source);
     char substr[MAXN],resubstr[MAXN];
     while(sublen> 0){
           for(int i =0; i <=sourcelen - sublen; i ++){
                 strncpy(substr, source+ i, sublen);
                 strncpy(resubstr, source+ i, sublen);
                 substr[sublen] ='/0';
                 resubstr[sublen] ='/0';
                 my_strrev(resubstr);
                 bool flag =true;
                 for(int j =0; j <n; j ++)
                       if(strstr(str[j],substr) ==NULL
                           &&strstr(str[j],resubstr) == NULL){
                                  flag = false;break;
                           }
                 if(flag)return(sublen);
           }
           sublen --;
     }
     return(0);
}
int main()
{
     char minstr[MAXN];
     int i, j, n,minlen, test;
     scanf("%d",&test);
     while(test --){
          scanf("%d",&n);
          getchar();
          minlen = 100;
          for(i =0; i <n; i ++) {
                scanf("%s",str[i]);
                if(minlen>strlen(str[i])){
                      minlen =strlen(str[i]);
                      strcpy(minstr,str[i]);
                }
          }
          printf("%d/n",max_substr(minstr,n));
     }
     return(0);

原创粉丝点击