在s1中通过循环移位,使s1包含s2
直接暴搜,
for(int i=0;i<la;i++)
{
if(s1[i]==s2[0])
for(int j=1,k=i+1;j<lb;j++,k++)
{
if(s1[k%la]!=s2[j])
break;
}
}
kmp模板
模式匹配
kmp中next数组表示如果当前匹配不成功,匹配串移动到的位置,不考虑移动到的位置的数与当前位置数的关系。
kmp中nextval数组表示如果当前匹配不成功,匹配串移动到的位置,考虑移动到的位置的数与当前位置数的关系。
1.获取模式串next数组
<pre name="code" class="cpp">void getnext(char *pat)
{
int lp = strlen(pat);
int i = 0;
int j = -1;
next[0] = -1;
while(i < lp)
{
if(j == -1 || pat[i] == pat[j])
{
i++;
j++;
next[i] = j;
}
else
j = next[j];
}
}<span style="font-family: Arial, Helvetica, sans-serif;"> </span>
2.nextval数组
void getnextval(char *str)
{
int len = strlen(str);
int i = 0;
int j = -1;
next[0] = -1;
while(i<len)
{
if(j==-1||str[i]==str[j])
{
i++;j++;
if(str[i]!=str[j])next[i]=j;
else next[i]=next[j];
}
else j=next[j];
}
}
3.kmp
如果不匹配模式串回到j=next[j]继续匹配
用kmp代码:
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
int next[100010];
char a[200010],b[100010];
void getnext(char *pat)
{
int len_pat = strlen(pat);
int i = 0;
int j = -1;
next[0] = -1;
while(i < len_pat)
{
if(j == -1 || pat[i] == pat[j])
{
i++;
j++;
next[i] = j;
}
else
j = next[j];
}
}
int kmp(char *str, char *pat)
{
int i = 0;
int j = 0;
int len_str = strlen(str);
int len_pat = strlen(pat);
getnext(pat);
while(i < len_str)
{
if(j == -1 || str[i] == pat[j])
{
i++;
j++;
}
else
j = next[j];
if(j >= len_pat)
return 1;
}
return 0;
}
int main()
{
int len_a,len_b,i;
while(~scanf("%s%s",a,b))
{
len_a = strlen(a);
len_b = strlen(b);
if(len_a < len_b)
{
printf("no\n");
continue;
}
for(i = 0; i <len_a; i++)
a[i+len_a] = a[i];
a[i+len_a] = '\0';
if(!kmp(a,b))
printf("no\n");
else
printf("yes\n");
}
return 0;
}