-
描述
-
Given two strings A and B, whose alphabet consist only ‘0’ and ‘1’. Your task is only to tell how many times does A appear as a substring of B? For example, the text string B is ‘1001110110’ while the pattern string A is ‘11’, you should output 3, because the pattern A appeared at the posit
-
输入
- The first line consist only one integer N, indicates N cases follows. In each case, there are two lines, the first line gives the string A, length (A) <= 10, and the second line gives the string B, length (B) <= 1000. And it is guaranteed that B is always longer than A. 输出
-
For each case, output a single line consist a single integer, tells how many times do B appears as a substring of A.
下面代码为sunday字符查找算法,查找出第一次所求字符所在位置:
-
下面代码为在整个字符串中查找出所有模板字符串的次数:
-
#include <iostream>
using namespace std;
int sunday(const char* src,const char *pat,int pos=0)
{
if(pos<0||pos>strlen(src))
{
return -1;
}
int next[2];
for(int i=0;i<2;i++)//将距离设置为模板长+1
{
next[i]=strlen(pat)+1;
}
for(int i=0;i<strlen(pat);i++)//记录0,1离最右端的距离
{
next[pat[i]-'0']=strlen(pat)-i;
}
int i=pos;
int j=0;
while(pos<(strlen(src)-strlen(pat)+1))
{
for(i=0,j=0;j<strlen(pat);i++,j++)
{
if(src[i+pos]!=pat[j])
{
pos+=next[src[pos+strlen(pat)]-'0'];
break;
}
}
if(j==strlen(pat))
{
return pos;
}
}
return -1;
}
int main(int argc, char *argv[])
{
char *s1="1110111111100101";
char *s2="010";
cout<<sunday(s1,s2)<<endl;
return 0;
}
#include <iostream>
using namespace std;
static int pos=0;
int sunday(const char* src,const char *pat)
{
if(pos<0||pos>strlen(src))
{
return -1;
}
int next[2];
for(int i=0;i<2;i++)//将距离设置为模板长+1
{
next[i]=strlen(pat)+1;
}
for(int i=0;i<strlen(pat);i++)//记录0,1离最右端的距离
{
next[pat[i]-'0']=strlen(pat)-i;
}
int i=pos;
int j=0;
while(pos<(strlen(src)-strlen(pat)+1))
{
for(i=0,j=0;j<strlen(pat);i++,j++)
{
if(src[i+pos]!=pat[j])
{
pos+=next[src[pos+strlen(pat)]-'0'];
break;
}
}
if(j==strlen(pat))
{
return pos;
}
}
return -1;
}
int main(int argc, char *argv[])
{
char *s1="111011001010";
char *s2="11";
int count=0;
while(pos<(strlen(s1)-strlen(s2)+1))
{
if(sunday(s1,s2)>=0)
{
count++;
}
pos++;
}
cout<<count<<endl;
return 0;
}