• 字符串匹配sunday算法c++实现(转)


    转载于http://blog.csdn.net/eqmcc/article/details/8205249

    sunday.h

    #include <cstdlib>
    #include <string>
    #include <iostream>
    #include <map>
    
    #ifndef _SUNDAYDLL_H_
    #define _SUNDAYDLL_H_
    
    using namespace std;
    
    class Sunday{
    
        public:
        Sunday(string & _pattern){
            pattern=_pattern;
            pattern_length = pattern.size();
            match_offset=-1;
        }
        ~Sunday(){}
    
        // build the Bad char table using a map,计算模式串要移动的距离
        void build_BC(){
            for(int i=0;i<pattern_length;++i){
                    BC[pattern[i]]=pattern_length-i-1;//用了map
                }
        }
    
        void show_BC(){
            map<char,int>::iterator it= BC.begin();
            while(it != BC.end()){
                cout<<"["<<it->first<<"]=>"<<it->second<<"	"<<endl;
                ++it;
            }
        }
    
        int calc_jump(int i){
            map<char,int>::iterator it= BC.find(text[i]);
            return (it==BC.end())?pattern_length:it->second;
        }
    
        void match(string & _text){
            text=_text;
            int text_length=text.size();
            int i=pattern_length-1;
            int pos=pattern_length-1;
            match_offset=pattern_length-1;
            while(pos<=text_length){
                while(i>=0 && pattern[i]==text[pos]){--i;--pos;}
                if(i<0){cout<<"match at offset: "<<match_offset-pattern_length+1<<endl;return;}
                else{
                    pos=match_offset+1;
                    int jump=calc_jump(pos);
                    pos=pos+jump;
                    if(pos>text_length){cout<<"no match"<<endl;}
                    i=pattern_length-1;
                    match_offset=pos;
                }
            }
        }
    
    
    
        private:
        map<char,int> BC; // Bad Char map
        string pattern,text;
        int pattern_length;
        int match_offset;
    };
    
    #endif /* _SUNDAYDLL_H_ */

    sunday.c

    #include <cstdlib>
    #include <string>
    #include <iostream>
    #include "sunday.h"
    
    int main()
    {
        string pattern = "search";
        string text = "substring searching algorithm";
        cout<<"pattern: "<<pattern<<endl;
        cout<<"text: "<<text<<endl;
        Sunday * sunday = new Sunday(pattern);
        sunday->build_BC();
        //sunday->show_BC();
        sunday->match(text);
        return 0;
    }
    因为弱小,所以要变强,因为不想灭亡,所以选择战斗
  • 相关阅读:
    ES6解构之复杂数据
    QQ音乐API-借他人之力实现我的音乐盒
    canvas 简易的加载进度条
    File System 之本地文件系统
    File System 定额(配额查询)
    window.btoa 和 window.atob
    Web App、Hybrid App与Native App
    函数节流和函数防抖
    javascript瀑布流
    protobuf的使用(netty传输多种对象类型)
  • 原文地址:https://www.cnblogs.com/cmjason/p/3910550.html
Copyright © 2020-2023  润新知