zoukankan      html  css  js  c++  java
  • BM算法模式匹配——字符串与KMP比较

    下面是代码:BM是什么参考阮一峰老师的讲解  点击打开链接

    #include<iostream>
    #include<algorithm>
    #include<string.h>
    #include<string>
    #include<stdio.h>
    #include<stdlib.h>
    #include<math.h>
    #include<vector>
    #include <time.h>
    #include<windows.h>
    using namespace std;
    const int MAX_SIZE=5005;
    
    
    void set_ASC(int *ASC,int len,string& b,int& last)
    {
        int i;
        for(i=0; i<len; i++)
        {
            ASC[ (int)b[i]]=i;
            if(b[i]==b[len-1]&&i!=len-1) last=i;
        }
    }
    int bm(string &a,string& b)
    {
        int ASC[260],lena=a.size(),lenb=b.size();
        int i=lenb-1,j=lenb-1;
        int last=-1;
        memset(ASC,-1,sizeof(ASC));
        set_ASC(ASC,lenb,b,last);
        while(i<lena&&j<lenb)
        {
            int ii,jj;
            ii=i,jj=j;
            while(1)
            {
                if(a[ii]==b[jj])
                {
                    if(jj==0) return ii+1;
                    ii--,jj--;
                }
                else
                {
                    if(jj!=lenb-1) i+=max((jj-ASC[(int)a[ii]]),lenb-1-last);
                    else i+=(jj-ASC[(int)a[ii]]);
                    j=lenb-1;
                    break;
                }
            }
        }
        return -1;
    }
    void set_kmp_next(int *kmp_next,int len,string& b)
    {
        int i=0,j=-1;
        kmp_next[0]=-1;
        while(i<len)
        {
            if(j==-1||b[i]==b[j])
            {
                i++;
                j++;
                kmp_next[i]=j;
            }
            else
                j=kmp_next[j];
        }
    }
    int kmp(string &a,string& b)  // a 为原串  ,b 为模式串
    {
        int i,j,lena=a.size(),lenb=b.size();
        int kmp_next[MAX_SIZE];
        set_kmp_next(kmp_next,lenb,b);
        i=j=0;
        while(i<lena)
        {
            if(j==-1||a[i]==b[j])
            {
                i++;
                j++;
            }
            else
                j=kmp_next[j];
            if(j==lenb)
                return i-j+1;
        }
        return -1;
    }
    int main()
    {
    //    freopen("stdin.txt","r",stdin);
    //    freopen("stdout.txt","w",stdout);
        string a,b;
        while(cin>>a>>b)
        {
            printf("%d
    ",bm(a,b));
            printf("%d
    ",kmp(a,b));
            printf("
    ");
        }
        return 0;
    }
    


  • 相关阅读:
    PL/SQL Developer连接Oracle
    Oracle 11g 监听命令
    Oracle 11g的登陆问题
    PL/SQL Developer 配置和使用
    KMP应用求两个字符串的最长公共子串
    msc pool概念
    nformix调优之执行计划取得
    lsof 与fuser
    informix onstat命令收集
    各类系统上查看占cpu最多的进程
  • 原文地址:https://www.cnblogs.com/coded-ream/p/7207985.html
Copyright © 2011-2022 走看看