首页 > 代码库 > 字符串匹配sunday算法c++实现(转)
字符串匹配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<<"\t"<<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;}
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。