查找与一个字符串的结尾和下一个字符串的开头匹配的最长子字符串

时间:2018-08-15 14:20:08

标签: c

任务是在string1的末尾(即string2的开头)找到最长的子字符串。

例如,如果string1是“ monitor”,而string2是“ orange”,则输出必须是“ or”。

例如,如果string1是“ bridge”而string2是“ gear”,则输出必须是“ ge”。

不幸的是,我的代码给出了“ bridge” /“ gear”示例的答案为“ rge”。请帮助我找到此代码中的错误。

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

void main()
{
    char a[80],b[80];
    int i,j,t;
    scanf("%s",a);//input s1 example bridge
    scanf("%s",b);//input s2 example gear
    for(i=0;a[i]!='\0';i++)//traversing through first string
    {
      for(j=i-1;j>=0;j--)

       if(a[i]==a[j])
       break;
       if(j==-1)
       for(t=0;b[t]!='\0';t++)

         if(a[i]==b[t])
         { 
          printf("%c",a[i]);  //output must be ge but this code gives me the output as rge
          break;
         }

    }
}

2 个答案:

答案 0 :(得分:1)

我建议您使用strncmp()函数比较字符串。它确实简化了任务。以下是代码,该代码简短,易读且易于理解:

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

void main()
{
    char a[80],b[80];
    char* pa;

    scanf("%s",a); //input s1 example bridge
    scanf("%s",b); //input s2 example gear

    // Iterate over "end substrings" of s1 (from the longest to the shortest)
    for (pa = a; *pa != '\0'; pa++)
    {
        // Compare with "start substring" of s2
        if (strncmp(pa, b, strlen(pa)) == 0)
            // Here it matches: exit from loop !
            break;
    }

    // Display the result
    if (strlen(pa) == 0)
    {
        printf("Nothing found\n");
    }
    else
    {
        printf("Found: %s\n", pa);
    }
}

我可能还会建议您采取以下非常短的方法:

void main()
{
    char a[80],b[80];
    char* pa = a;

    scanf("%s",a); //input s1 example bridge
    scanf("%s",b); //input s2 example gear

    while (strncmp(pa, b, strlen(pa)) && (*(++pa) != '\0'));

    printf("%s", strlen(pa) == 0 ? "Nothing found" : pa);
}

答案 1 :(得分:0)

我想我明白了。

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

void main() {
    char a[80],b[80];
    int i,j,t;
    scanf("%s",a);//input s1 example bridge
    scanf("%s",b);//input s2 example gear

    int k=0; //start with the first caracther
    int memo=0;
    for(int i=0;i<strlen(a);i++) {
        if(a[i] == b[k]) {
            k++; //increase
            if(memo == 0) {
                memo = i; //save the start
            }
        }
        // reset the compar
        else {
            k = 0;
            i = memo + 1;
            memo = 0; 
        }
    }
    //if end with memo
    if(memo != 0) {
        for(int i=memo;i<strlen(a);i++) {
            printf("%c",a[i]);
        }
    }

}