A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 ⒈心只霸占沵 于 2014-5-25 23:01 编辑

下面是我用C写的,找出两个字符串中最长的共同部分,写的太麻烦,不知道哪位学过C的大神给我想个简单的办法,告诉我一些C中的方法!谢谢
  1. //匹配相同的字符串
  2. int compareStr(char str1[],char str2[])
  3. {
  4.     int choice=0;//跳出外循环的标记
  5.     for(int i=0;i<strlen(str2);i++)
  6.     {
  7.         for(int j=0,k=(int)strlen(str2)-i;k<(int)strlen(str2)+1;j++,k++)
  8.         {
  9.             
  10.             int len=k-j;
  11.             char temp[len+1];
  12.             int  tempIndex=0;
  13.             //将子字符串复制给temp  长字符串若为abcbcbcd  短字符串若干位abc   则temp 的情况为 abc  ab  bc  a  b  c
  14.             for(int l=j;l<k;l++)
  15.             {
  16.                 temp[tempIndex]=str2[l];
  17.                 tempIndex++;
  18.             }

  19.             temp[len]='\0';//字符串以\0结尾所以将最后一个位置初始化为0
  20.             
  21.             int flag=isContain(str1, temp);//判断str字符串是否包含temp   如果包含返回1 否则返回0
  22.               if(flag){
  23.                   printf("%s和%s的公共部分:%s\n",str1,str2,temp);//如果包含,将choice标记改为1,用于跳出外循环
  24.                   choice=1;
  25.               }
  26.            }
  27.         
  28.         if(choice){//主要用来跳出最外层的循环
  29.             break;
  30.         }
  31.     }
  32.     //如果循环已经结束,choice仍然为0说明两个字符串并没有找到相同的部分
  33.      if(!choice)
  34.          printf("%s和%s没有公共部分\n",str1,str2);
  35.     return 1;
  36. }

  37. //一个字符串中是否包含另一个字符串
  38. int isContain(char str1[] ,char str2[])
  39. {
  40.     //循环判断长字符串中短字符串出现的位置   假如 abcbcbcd    abc 查寻abcbcbcd中的  abc 中的a出现的位置
  41.     for(int i=0;i<strlen(str1);i++)
  42.     {
  43.         if(str1[i]==str2[0])//若找到abcbcbcd中a的位置,进行循环判断 abcbcbcd中的 后面的字母是否与abc中的后面字母相同
  44.         {    int flag=0;
  45.             int tempI=i;//纪录下abcbcbcd中abc中的a出现的位置
  46.             for(int j=0;j<strlen(str2);j++)//循环判断后面的字符
  47.             {
  48.                 if(str1[tempI]!=str2[j])//如果后面的有不相同,继续找abcbcbcd中的下一个a,将循环判断停止
  49.                 {
  50.                     flag=1;
  51.                     break;
  52.                 }
  53.                 tempI++;
  54.             }
  55.             
  56.             if(flag)
  57.                 continue;
  58.             //若走到这一步,说明for循环没有break,说名abcbcbcd中包含abc,所以直接返回1 代表包含
  59.             return 1;
  60.         }
  61.     }
  62.     //如果整个字符串全部匹配完成,做到这一步说明abcbcbcd中没有包含abc 就返回0
  63.     return 0;
  64. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
傘が咲く + 1

查看全部评分

14 个回复

倒序浏览
              期待        大神   
回复 使用道具 举报
我在膜拜大神
回复 使用道具 举报
坐等大神
回复 使用道具 举报
坐等 楼下大神!
回复 使用道具 举报
{:3_46:}看起来你们都好牛b的样子。
回复 使用道具 举报
跟大家一样等呗
回复 使用道具 举报
说下我的思路吧,  定义一个二维数组,,,遍历两个字符串, 取出第一个字符串的第i个字符,从第二个字符串第1个字符开始比较,相同就放到二维数组的第一行,再取出第一个字符串下一个字符,相同就放入二维数组的同一行
这样下来,二维数组里面存放的就是所有相同的字符串,,再将这些字符串排序找出最大的
回复 使用道具 举报
看着有点晕{:2_40:}
回复 使用道具 举报
本帖最后由 liulinjie 于 2014-5-24 20:59 编辑

我的思路也是遍历两个字符串 - 把第一个字符串的字符逐个和第二个字符串的字符比较. 只是我没逐个储存子字符串, 就是只记下最长子字符串的长度和起始位置, 最后回到原字符串中找出那个最长的公共字符串.

  1.     // 找出两个字符串 seqA 和 seqB 的最大公共子字符串

  2.     // maxLength储存最大公共字符串的长度, index储存公共字符串在seqA中的起始位置
  3.     int maxLength = 0, index = 0, i;

  4.     for (int ia = 0; ia < strlen(seqA); ia++) {
  5.         // 把第一个字符串中的每个字符和第二个字符串的字符逐个比较
  6.         for (int ib = 0; ib < strlen(seqB); ib++) {
  7.             // 如果字符不相同, 直接进入下一次循环
  8.             // 如果字符相同, 继续比较后面的字符
  9.             if (seqA[ia] == seqB[ib]) {
  10.                 i = 0;         // i 记录当前公共字符串的长度
  11.                 while (seqA[ia+i] == seqB[ib+i]) {
  12.                     i++;
  13.                 }
  14.                 // 检查是不是最长的公共字符串
  15.                 if (i > maxLength) {
  16.                     maxLength = i;
  17.                     index = ia;
  18.                 }
  19.             }
  20.         }
  21.     }

  22.     // 输出一下结果 (也可以把公共字符串存储到一个字符串里)
  23.     printf("字符串 %s 和 %s 的最大公共子字符串是 ", seqA, seqB);
  24.     for (i = 0; i < maxLength; i++)
  25.         printf("%c", seqA[index+i]);
  26.     printf("\n");
复制代码

点评

谢谢支持! :) 欢迎点评  发表于 2014-5-24 21:54
支持一下  发表于 2014-5-24 21:33

评分

参与人数 1技术分 +1 收起 理由
傘が咲く + 1

查看全部评分

回复 使用道具 举报
/*
找出多个字符串中的最大公共子字符串,如“my name is Lilei”和“Lilei”的最大子串是:”Lilei”。(C语言)
思路:
如my name is Lilei 和 Lilei这两个字符串
将第一个字符串中的每一个字符拿出来去和第二个字符串中的字符比较,如果遇到相同的就将第一个字符位置加1与第二个字符串加1相比,直到两者的字符不再相等,将得到的字符串用字符串数组存储起来。
*/

#include <stdio.h>
#include <string.h>

void getStr(char *str1,char *str2,char *str3)
{
    //定义一个整形数来记住最大字符串的长度
    int max = 0;
    //定义一个整形数来记住相同字符的首地址
    int i,j,r;
    //获取str1的长度
    int len1 = strlen(str1);
    //获取str2的长度
    int len2 = strlen(str2);
   
    for (i = 0; i < len1; i++) {
        for (j = 0; j < len2; j++) {
            if (str1[i] == str2[j]) {
                //用于保存第一个相等的首地址
                //用于调试代码
                printf("找到相同的字符啦!!--- %c\n",str1[i]);
                int a = i,b = j,count = 1;
                /*
                当第一个相等后继续用str1的下一个字符与str2的下一个字符相比,直到字符串结束或者,字符不在相等
                */
                while ((a + 1 < len1)&&(b + 1 < len2)&&(str1[++a] == str2[++b])){
                        count++;
                }
                if (count > max) {
                    max = count;
                    r = i;
                    //用于调试代码
                    printf("最大的字符串长度是%d---位置是%d---最大值%d\n",count,r,max);
                }
            }
        }
    }
    //判断是否有公共字符串
    //如果有将存在的字符串存入str3中
    if(max > 0){
        for(int k=0;k<max;k++)
        {
            *(str3+k)=*(str1+r+k);
            printf("%c",str3[k]);
        }
      
    }
}
int main()
{
    //nbitheimanb”和“itheia”
    char str1[100] = "my name is Lilei";
    char str2[100] = "Lilei";
    char str3[100] = {0};
    getStr(str1,str2,str3);
    printf("%s\n",str1);
    printf("%s\n",str2);
    printf("%s\n",str3);
    return 0;
}

上面是我刚才写的代码,是用for循环实现的,不知道是否对你有用
回复 使用道具 举报
liulinjie 发表于 2014-5-24 20:54
我的思路也是遍历两个字符串 - 把第一个字符串的字符逐个和第二个字符串的字符比较. 只是我没逐个储存子字 ...

这个思路也挺好,谢谢!
回复 使用道具 举报
:(这不是DP例题吗?

最长子序列还是字串?
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马