【字符串】KMP算法的实现
2015-06-02 11:07
323 查看
来源:脑客爱刷题
vector<int> GetNextArr(const string &match) { vector<int> NextArr; if (match.empty()) return NextArr; if (match.size() == 1) return vector<int>(1, -1); NextArr = vector<int>(match.size()); NextArr[0] = -1;//规定res[0]=-1 NextArr[1] = 0; int cn = 0,i=2;//cn记录着上一轮计算得到的最长匹配前缀的长度,i是match的下标 while (i < match.size()) { if (match[i - 1] == match[cn]) { NextArr[i] = cn + 1; ++i; ++cn; } else if (cn>0) cn = NextArr[cn]; else // cn==0 { NextArr[i] = 0; ++i; } } return NextArr; } int KMP(const string &str, const string &match) { if (match.empty()) return 0; if (str.size() < match.size()) return -1; vector<int> NextArr = GetNextArr(match); int i = 0, i_match = 0; while (i < str.size() && i_match < match.size()) { if (str[i] == match[i_match]) { ++i; ++i_match; } else if (i_match == 0) { ++i; } else { i_match = NextArr[i_match]; } } if (i_match == match.size()) return i - match.size(); else return -1; }
相关文章推荐
- js原型继承
- 分分钟搞定LaunchMode
- Contains Duplicate
- GemFire
- 编程之美面试题12
- mysql四:30多条mysql数据库优化方法,千万级数据库记录查询轻松解决
- Raspberry Pi2 Model B下Tl-WN725N v2.0无线网卡驱动
- git rebase和git merge
- 专家检索
- gdb
- [经典]浅析Linux IO技术体系
- Tiny示例:对整个目录中的POM树进行批量处理
- AspNet MVC4 教学-22:Asp.Net MVC4 Partial View 技术快速应用Demo
- javascript深入理解js闭包
- 开源协议
- solr特点三: 排序样例汇总
- 【转】【Taven.李锡远】敏捷开发之Scrum扫盲篇
- MySQL性能优化的21个最佳实践 和 mysql使用索引
- CentOS 6.4中升级编译安装GCC 4.8.1 + GDB 7.6.1 + Eclipse 以及Kdump配置
- 九度OJ-题目1385:重建二叉树