C语言BF算法找子串

题目描述

输入一些字串对,从第一个字串中找第二个字串。找到就说“Yes”,否则就说“No”。

输入

每行输入两个用空格分割的字串
字符串长度可达10000000

输出

若能找到输出Yes
反之输出No

样例输入

abcde a3
defsgbdffgfgbn dff

样例输出

No
Yes

今天学习了一下字符串匹配的BF算法找了到题目发现字符串下标从0开始还是和视频里面从1开始略略有一点点不一样
从下标0开始的话:外面的while(i<s1.length && j<s2.length)匹配失败的i=i-j+1(i-j回溯到原来的位置+1变成下一个位置)j=0
从下标1开始的话:外面的while(i<=s1.length && j<=s2.length)匹配失败的i=i-j+2(i-j+1回溯到原来的位置+1变成下一个位置)j=1

#include <stdio.h>
#include <stdbool.h>
#include <string.h>
#include <stdlib.h>
#define maxsize 10000000

typedef struct string
{
char str[maxsize];
int length ;
}String ;
bool foundSubString(String *s1,String *s2);
int main()
{
  String *s1=(String *)malloc(sizeof(String));
  String *s2=(String *)malloc(sizeof(String));
  while(scanf("%s %s",s1->str,s2->str)!=EOF)
  {
    s1->length=strlen(s1->str);
    s2->length=strlen(s2->str);
    if( foundSubString(s1,s2))
    {
      printf("Yes\n");
    }else printf("No\n");

  }
}
bool foundSubString(String *s1,String *s2)
{
  int i=0 ;
  int j=0 ;
  while(i<s1->length && j<s2->length)
  {
    if(s1->str[i]==s2->str[j]) //若每个都匹配成功分别++
    {
      i++;
      j++;
    }
    else
    {
      i=i-j+1; //匹配失败i回溯到下一个 j从1开始
      j=0;
    }
  }
  if(j>=s2->length)
  {
    return true ;//位置的话是i-s2->length,此时i=9
  }
  else return false;
}

 
 

猜你喜欢

转载自www.cnblogs.com/cocobear9/p/12629380.html