字符串模式匹配的KMP算法实现

来源:互联网 发布:网络诈骗案证据不足 编辑:程序博客网 时间:2024/05/18 17:26

方法一:朴素模式匹配

思路:遍历主串,匹配失败则模式串右移1位,重新从头开始匹配

#include<iostream>#include<string>using namespace std;//字符串模式匹配(返回第一次匹配的下标)//朴素算法//s为主串 int index(string s, string ss){//长串为主串if(s.size() < ss.size()) {string tmp = s;s = ss;ss = tmp;} int i(0), j(0), flag(0);while(i <= s.size() - ss.size()  && !flag) {j = 0;flag = 1;while(j < ss.size() && flag) {if(ss[j] == s[i + j])++ j;else flag = 0;}++ i;}return flag ? (i - 1) : -1;} int main(){string s(""), ss("");while(cin >> s >> ss) {cout << index(s, ss) << endl; }return 0;}
方法二:KMP算法实现

KMP的思路和理解,借鉴几篇博客:

http://www.matrix67.com/blog/archives/115

http://kenby.iteye.com/blog/1025599

下面是我的代码:

#include<iostream>#define MAXN 11111using namespace std;//s为主串 void change(string *s, string *ss){if((*s).size() < (*ss).size()) {string tmp = *ss;*ss = *s;*s = tmp;}}void get_next(string ss, int next[]){int len = ss.size();int i = 0, j = -1;next[0] = -1;while(i < len) {if(j == -1 || ss[i] == ss[j]) {next[ ++ i ] = (++ j);}else {j = next[j];}}}int kmp(string s, string ss, int next[]){int s_len = s.size(), ss_len = ss.size();int i(0), j(0);while(i < s_len && j < ss_len) {if(j == -1 || s[i] == ss[j]) {++ i; ++ j;}else {j = next[j];}}if(j == ss_len) return (i - ss_len);return -1;}int main(){//s为主串 string s(""), ss("");int next[MAXN];while(cin >> s >> ss) {change(&s, &ss);get_next(ss, next);cout << kmp(s, ss, next) << endl; }return 0;}



0 0
原创粉丝点击