二进制字符串匹配

题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=5

暴力:

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

char a[15];
char b[1005];
int len1,len2;

int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int i,j;
        int Count=0;
        scanf("%s%s",a,b);
        len1=strlen(a);
        len2=strlen(b);
        for(i=0;i<len2-len1+1;i++)
        {
            for(j=0;j<len1;j++)
            {
                if(a[j]!=b[i+j])
                    break;
            }
            if(j==len1)
                Count++;
        }
        printf("%d
",Count);
    }
    return 0;
}

STL:

 
///STL

#include <iostream>
#include <cstdio>
#include <string>
#include <algorithm>

using namespace std;

int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        string p,s;
        cin>>p>>s;
        int ans=0;
        int num=0;
        ans=s.find(p,0);
        while(ans!=string::npos)
        {
            num++;
            ans=s.find(p,ans+1);
        }
        printf("%d
",num);
    }
    return 0;
}
        

KMP

///KMP

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>

using namespace std;

char p[1005],s[1005];
int next[1005];

void getnext()///对齐p[j]
{
    int i=0,j=-1,len=strlen(p);
    next[0]=-1;
    while(i<len-1)
    {
        if(j==-1||p[i]==p[j])///如果p[i]和p[j]相等,next[i]就等于j,这样在调用next[i]时j(调用时的j)就直接到p[j]的位置了。
        {
            j++;
            i++;
            next[i]=j;
        }
        else j=next[j];///p[i]和p[j]不相等时,p[j]就从新对齐。同理p和s的比较。
    }
}

int kmp()
{
    int i=-1,j=-1,lenp=strlen(p),lens=strlen(s);
    getnext();
    int num=0;
    while(i<lens)
    {
        if(j==-1||s[i]==p[j])///s[i]和p[j]相等就往后面走
        {
            ++i;
            ++j;
        }
        else j=next[j];///s[i]和p[j]不相等就要从新对齐p[j],
        if(j==lenp)
        {
            i=i-j;
            j=-1;
            num++;
        }
    }
    return num;
}

int main()
{
    int n;
    scanf("%d",&n);
    while(n--)
    {
        scanf("%s%s",p,s);
        printf("%d
",kmp());
    }
}
原文地址:https://www.cnblogs.com/TreeDream/p/5322823.html