首页 > 代码库 > HDU-1238-Substrings

HDU-1238-Substrings

题目链接

http://acm.hdu.edu.cn/showproblem.php?pid=1238

 

题意:给你n个字符串,找出最长公共子串。

解法: 找到长度最小的字符串,枚举所有子串,

这题我又学到了一个

C语言strstr()函数:返回字符串中首次出现子串的地址

头文件:#include <string.h>

strstr()函数用来检索子串在字符串中首次出现的位置,其原型为:
    char *strstr( char *str, char * substr );

【参数说明】str为要检索的字符串,substr为要检索的子串。

【返回值】返回字符串str中第一次出现子串substr的地址;如果没有检索到子串,则返回NULL。

【函数示例】strstr()函数的使用。

#include<stdio.h>#include<string.h>int main(){    // 也可以改成 char str[] = "http://see.xidian.edu.cn/cpp/u/xitong/";    char *str = "http://see.xidian.edu.cn/cpp/u/xitong/";    char *substr = "see";    char *s = strstr(str, substr);    printf("%s\n", s);    return 0;}

运行结果:
see.xidian.edu.cn/cpp/u/xitong/

 

代码

 

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#define inf 1000
using namespace std;

 

int main(void)
{
int i,j,k,k1,k2,k3,t,n;
int f;
char a[110][110];
char s1[110],s2[110];
scanf("%d",&t);
while(t--)
{
int Max=0;
k1=inf;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%s",a[i]);
k2=strlen(a[i]);
if(k1>k2)
{
k1=k2;
f=i;
}
}
int len=strlen(a[f]);
for(i=0;i<len;i++)
{
for(j=i;j<len;j++)
{
for(k=i;k<=j;k++)
{
s1[k-i]=a[f][k];
s2[j-k]=a[f][k];
}
s1[j-i+1]=s2[j-i+1]=‘\0‘;
int flag=1;
for(k=0;k<n;k++)
{
if(!strstr(a[k],s1)&&!strstr(a[k],s2))
{
flag=0;
break;
}
}
int chang=j-i+1;
if(flag&&chang>Max)
{
Max=chang;
}
}
}
printf("%d\n",Max);
}
return 0;
}

 

HDU-1238-Substrings