题目描述
输入
字符串长度可达10000000
输出
反之输出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;
}