• 二进制字符串匹配


    题目链接: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());
        }
    }
  • 相关阅读:
    XML操作
    C# 相等(==,Equals)
    VS插件 选项卡竖排列
    springcloud版本号
    @EnableDiscoveryClient和@EnableEurekaClient的区别
    在mvn构建时直接将项目jar包做成服务第三方工具
    java引用的强制转型
    java基础类型的byte为长度
    springboot访问服务器本地静态文件的方法
    nginx反向代理和负载均衡的基本配置
  • 原文地址:https://www.cnblogs.com/TreeDream/p/5322823.html
Copyright © 2020-2023  润新知