黑马程序员技术交流社区
标题:
找出多个字符串中的最大公共子字符串
[打印本页]
作者:
xiedongjiao
时间:
2015-3-19 13:51
标题:
找出多个字符串中的最大公共子字符串
题目:找出多个字符串中的最大公共子字符串,如“nbitheimanb”和“itheia”的最大子串是:”ithei”。(C语言)
感觉自己的这种方法挺麻烦,以下是代码,求交流!
<P> #include <stdio.h>
#include <string.h>
char res1[100] = "", res2[100] = "";</P>
<P>char *fun(char * str1, char * str2)
{
int i,j,k;
int point = 1;//用于标记公共字符串的存储位置
for(i=0;i<strlen(str1);i++)
{
k = i;
for(j=0;j<strlen(str2);j++)
{
if(str1[k] == str2[j])
{
if(point == 1)
{
strncat(res1, &str1[k], 1);
k++;
}
else
{
strncat(res2, &str1[k], 1);
k++;
}
}
else
{
if(strlen(res1)<strlen(res2))
{
memset(res1,0,100);
point = 1;
}
else
{
memset(res2,0,100);
point = 2;
}
}
}
if(strlen(res1)<strlen(res2))
{
memset(res1,0,100);
point = 1;
}
else
{
memset(res2,0,100);
point = 2;
}
}
if((strlen(res1)==strlen(res2))&&(!strlen(res1)))
{
printf("无公共字符串\n");
return NULL;
}
if(strlen(res1)<strlen(res2))
return res2;
else
return res1;
}
int main()
{
char string1[100] = "", string2[100] = "", string3[100] = "";
printf("请输入三个字符串\n");//仅以三个字符串代表多个字符串
scanf("%s %s %s", string1, string2, string3);
char *result;
result = fun(string1, string2);
if(result != NULL)
{
result = fun(result, string3);
if(result!=NULL)
printf("%s\n", result);
}
return 0;
}</P>
复制代码
作者:
wenfeng340
时间:
2015-3-19 14:36
这是我做基础测试的时候做的
#include <stdio.h>
#include <string.h>
#define N 2
#define MAXLEN 100
void main()
{
char note[20];
int maxLen = MAXLEN;
char *pStr[N],pStr1[N][MAXLEN];
int i,j,k,min,maxlen= 0;
char maxStr[MAXLEN],*tmpStr,*temp,temp1[MAXLEN];
int len,len0,n1;
n1=N;
sprintf(note,"请输入%d个字符串",n1);
printf("%s\n",note);
//找出输入的字符串中长度最小的串,并把最小串序号记在min中
for(i = 0; i < N; i++){
gets(pStr1[i]);
pStr[i]=pStr1[i];
len = strlen(pStr[i]);
if(len < maxLen){
maxLen = len;
min = i;
}
}
//把最小的字符串放到第一个位置
temp = pStr[0];
pStr[0] = pStr[min];
pStr[min] = temp;
len0 = strlen(pStr[0]);
for(i = 0; i < len0 ; i++)
{
for(j = 0; j < len0 ; j++)
{
memset(temp1,0,MAXLEN);
for(int n=0;n<=len0-j-i-1;n++) //求出第一个字符串的子字符串
{
temp1[n]=pStr[0][i+n];
}
tmpStr = temp1;
if(strlen(tmpStr)<1)
continue;
for(k = 1; k < N; ++k)
{
if(strstr(pStr[k],tmpStr) == NULL)
break;
else
continue;
}
if(k == N)
{
if(strlen(tmpStr) > maxlen)
{
memset(maxStr,0,MAXLEN);
maxlen = strlen(tmpStr);
for(int v=0;v<strlen(tmpStr);v++)
{
maxStr[v]=tmpStr[v];
}
}
}
}
}
printf("最大公共子串为:");
printf("%s",maxStr);
getchar();
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2