首页 > 代码库 > 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