黑马程序员技术交流社区

标题: 求助 关于C语言求最大公共字符串。 [打印本页]

作者: 87526845    时间: 2015-1-26 09:45
标题: 求助 关于C语言求最大公共字符串。
运行起来有时候是对的,但有时候又不对。
#include<stdio.h>
#include<string.h>
int main()
{
    char ch1[100];
    char ch2[100];      //定义2个字符数组用语保存键盘输入的字符
    printf("请输入一串字符:");
    scanf("%s",ch1);
    printf("请再输入一串字符:");
    scanf("%s",ch2);
    int length1 =strlen(ch1);
    int length2 = strlen(ch2);    //取的2个字符串的长度用于遍历
    int count=1;
    int max=0,which=0;             //定义3个整型数组用于保存值。

    for (int i =0;i<length1;i++)
    {  for(int j=0;j<length2;j++)
       {
           if (ch2[j]==ch1)     //当2个字符数组中有第一个字母相等的时候,进行下面的筛选。
           {

              if  ((ch2[j+1]==ch1[i+1])&&j+1<=length2&&i+1<=length1)
               {
                   count++;              //在第一个字母相等之后如果第二个字母也相等,且其没有超过字符串                总长度,时候其相等的个数+1.

               }
              else
              {
                  break;            //如果第二个字母不相等,或者长度超过了退出这次循环
              }


               if (max<count)
               {
                   max =count;           //找出最大的相等值,并且通过个数来确定此时字母串从哪一个开始相等的。
                   which =i+2-count;
                }
               else
               {
                   count =1;
               }
           }
        }
       }
    for(int i=0;i<max;i++)
    {
        printf("%c",ch1[which+i]);
    }
    printf("\n");
    return 0;
}
下面是运行的图


2.jpg (99.88 KB, 下载次数: 16)

2.jpg

作者: 曼珠沙华    时间: 2015-1-26 09:45
#include <stdio.h>
#include <string.h>
int  main()
{
   
    char *s1 = "nbitheimanbcf";
    char *s2 = "itheia";
   
    void maxPublicString(char *s1,char *s2);
    maxPublicString(s2,s1);
   
    return 0;
}
void maxPublicString(char *s1,char *s2)
{
    //分别求出s1,s2字符串的长度
    int s1len = strlen(s1);
    int s2len = strlen(s2);
   
    //记录相同元素下标,记录相同的元素个数
    int index = 0 ,count = 0;
   
    //遍历s1
    for(int i = 0; i<s1len ; i++)
    {
        
        //遍历s2
        for(int j = 0; j<s2len; j++)
        {
            
            //取出s2的每一个元素s1进行比较,
            if(s1[i]==s2[j])
            {
                //如果有相同的元素,则同时都往后面移动
                for(int k = 1 ;s1[i+k]==s2[j+k] && s2[j+k]!='\0' && s1[i+k]!='\0' ;k++)
                {
                    //选出最大公共字符串
                    if(k>count)
                    {
                        //记录最大公共字符串长度的下标
                        count =k;
                        
                        //记录最大公共字符串长度的个数
                        index = i;
                        
                    }
                }
               
               
            }
            
        }
        
        
    }
    if(count == 0)
    {
        printf("没有找到最大公共子串\n");
    }
    else
    {
        printf("最长公共字串是:");
        
        for(int i = 0 ; i<=count; i++)
        {
            printf("%c",s1[index+i]);
        }
    }
    printf("\n");
   
}
你试试,我运行没有问题
作者: 87526845    时间: 2015-1-26 09:46
图最下面那次运行结果就不对了
作者: 87526845    时间: 2015-1-29 20:48
我最想知道我哪里不对的。
作者: marswawa    时间: 2015-3-18 14:14
我的思路是用矩阵,来做,简单的说就是挨个扫描,用a字符串中的每一个字母去和b字符串中的字符比对,如果相同就用1来记录,如果不相同就用0来记录,等第二个字符比对的时候先判断自己之前比对的结果如果是1就标记为2如果为0就标记为1,也就是在前一位记录的基础上再加一,这样最后会得到一个一维数组,如[1,3,5,6],当然这个数组的长度取决于两个字符串中最大的字符串的长度,我们遍历此数组找到6,6的意思是说这两个字符串的最大公共字符串的长度是6,而恰恰6的索引位置就是最大公共字符串的最后一个字符所在的索引位置。以此就可以取出最大公共字符串,做完此题我感觉编程才是世界上最伟大的艺术。
作者: tt3tt3tt    时间: 2015-7-31 19:51
我也被抽到这题
#include<stdio.h>
#include<string.h>
#define N 20
int result=0;
void main()
{       
        char a[N],b[N];
        int l1,l2,i,j,max,flag,cont;
        printf("请输入第一个字符串(长):");
        gets(a);
        printf("请输入第二个字符串(短):");
        gets(b);

        max=flag=0;
        l1=strlen(a);
        l2=strlen(b);
        for(i=0;i<l1;i++)
        {       
                for(j=0;j<l2;j++)
                {
                        if(a[j+i]-b[j])
                        {
                               
                                if (cont>max)
                                {
                                        max=cont;
                                        result=i+j-cont;
                                }
                                flag=0;
                                cont=0;
                        }
                        else flag=1;
                        if(flag) cont++;
                }
                if (cont>max)
                {
                        max=cont;
                        result=i+j-cont;
                }
        }
        while(max)
        {
                printf("%c",a[result]);
                result++;
                max--;
}
                printf("\n");
}





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