黑马程序员技术交流社区

标题: 找出多个字符串中的最大公共子字符串 [打印本页]

作者: xiedongjiao    时间: 2015-3-19 13:51
标题: 找出多个字符串中的最大公共子字符串
题目:找出多个字符串中的最大公共子字符串,如“nbitheimanb”和“itheia”的最大子串是:”ithei”。(C语言)
感觉自己的这种方法挺麻烦,以下是代码,求交流!

  1. <P> #include <stdio.h>
  2. #include <string.h>
  3. char res1[100] = "", res2[100] = "";</P>
  4. <P>char *fun(char * str1, char * str2)
  5. {
  6. int i,j,k;
  7. int point = 1;//用于标记公共字符串的存储位置
  8. for(i=0;i<strlen(str1);i++)
  9. {
  10.   k = i;
  11.   for(j=0;j<strlen(str2);j++)
  12.   {
  13.    if(str1[k] == str2[j])
  14.    {
  15.     if(point == 1)
  16.     {
  17.      strncat(res1, &str1[k], 1);
  18.      k++;
  19.     }
  20.     else
  21.     {
  22.      strncat(res2, &str1[k], 1);
  23.      k++;
  24.     }
  25.    }
  26.    else
  27.    {
  28.     if(strlen(res1)<strlen(res2))
  29.     {
  30.      memset(res1,0,100);
  31.      point = 1;
  32.     }
  33.     else
  34.     {
  35.      memset(res2,0,100);
  36.      point = 2;
  37.     }
  38.    }
  39.   }
  40.   if(strlen(res1)<strlen(res2))
  41.   {
  42.    memset(res1,0,100);
  43.    point = 1;
  44.   }
  45.   else
  46.   {
  47.    memset(res2,0,100);
  48.    point = 2;
  49.   }
  50. }

  51. if((strlen(res1)==strlen(res2))&&(!strlen(res1)))
  52. {
  53.   printf("无公共字符串\n");
  54.   return NULL;
  55. }
  56. if(strlen(res1)<strlen(res2))
  57.   return res2;
  58. else
  59.   return res1;
  60. }
  61. int main()
  62. {
  63. char string1[100] = "", string2[100] = "", string3[100] = "";
  64. printf("请输入三个字符串\n");//仅以三个字符串代表多个字符串
  65. scanf("%s %s %s", string1, string2, string3);
  66. char *result;
  67. result = fun(string1, string2);
  68. if(result != NULL)
  69. {
  70.   result = fun(result, string3);
  71.   if(result!=NULL)
  72.    printf("%s\n", result);
  73. }
  74. return 0;
  75. }</P>
复制代码


作者: wenfeng340    时间: 2015-3-19 14:36
这是我做基础测试的时候做的

  1. #include <stdio.h>
  2. #include <string.h>
  3. #define N 2
  4. #define MAXLEN 100

  5. void main()
  6. {
  7.     char note[20];
  8.     int maxLen = MAXLEN;
  9.     char *pStr[N],pStr1[N][MAXLEN];
  10.     int i,j,k,min,maxlen= 0;
  11.     char maxStr[MAXLEN],*tmpStr,*temp,temp1[MAXLEN];
  12.         int len,len0,n1;
  13.         n1=N;
  14.         sprintf(note,"请输入%d个字符串",n1);
  15.         printf("%s\n",note);
  16.    
  17.     //找出输入的字符串中长度最小的串,并把最小串序号记在min中
  18.     for(i = 0; i < N; i++){
  19.         gets(pStr1[i]);
  20.                 pStr[i]=pStr1[i];
  21.         len = strlen(pStr[i]);
  22.         if(len < maxLen){
  23.             maxLen = len;
  24.             min = i;
  25.         }
  26.     }
  27.         //把最小的字符串放到第一个位置
  28.     temp = pStr[0];
  29.     pStr[0] = pStr[min];
  30.     pStr[min] = temp;

  31.     len0 = strlen(pStr[0]);
  32.     for(i = 0; i < len0 ; i++)
  33.     {
  34.         for(j = 0; j < len0 ; j++)
  35.         {
  36.                         memset(temp1,0,MAXLEN);
  37.                         for(int n=0;n<=len0-j-i-1;n++) //求出第一个字符串的子字符串
  38.                         {
  39.                                 temp1[n]=pStr[0][i+n];
  40.                         }
  41.             tmpStr = temp1;
  42.                         if(strlen(tmpStr)<1)
  43.                                         continue;
  44.             for(k = 1; k < N; ++k)
  45.             {
  46.                 if(strstr(pStr[k],tmpStr) == NULL)
  47.                     break;
  48.                 else
  49.                     continue;
  50.             }
  51.             if(k == N)
  52.             {
  53.                 if(strlen(tmpStr) > maxlen)
  54.                 {
  55.                                         memset(maxStr,0,MAXLEN);
  56.                     maxlen = strlen(tmpStr);
  57.                                         for(int v=0;v<strlen(tmpStr);v++)
  58.                                         {
  59.                                                 maxStr[v]=tmpStr[v];
  60.                                         }
  61.                 }
  62.             }
  63.         }
  64.     }
  65.     printf("最大公共子串为:");
  66.     printf("%s",maxStr);
  67.         getchar();
  68. }
复制代码








欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2