zoukankan      html  css  js  c++  java
  • 字符串匹配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;
    }
    因为弱小,所以要变强,因为不想灭亡,所以选择战斗
  • 相关阅读:
    echo
    shell
    grub
    find
    脚本案例
    dd if= of= MBR
    cat <<EOF> file
    fieldset——一个不常用的HTML标签
    闪烁图片
    跑马灯效果
  • 原文地址:https://www.cnblogs.com/cmjason/p/3910550.html
Copyright © 2011-2022 走看看