字符串匹配
来源:互联网 发布:javascript while循环 编辑:程序博客网 时间:2024/06/08 07:46
今天看算法导论,看到了一个字符串匹配算法特别有意思,有限自动机字符串匹配算法
说它有意思是因为算法维护了一个类似卡诺图的状态转换表,对于当前状态,接受不同字符转移到不同的状态,详情参考:https://zh.wikipedia.org/wiki/%E7%A1%AE%E5%AE%9A%E6%9C%89%E9%99%90%E7%8A%B6%E6%80%81%E8%87%AA%E5%8A%A8%E6%9C%BA
不过本文不说它,而是另外一个算是由其衍生来的KMP,直接上代码
#pragma once#include<iostream>#include<vector>using std::vector;//pattern为模式的类型名,需要定义size(返回模式长度的函数),t是模板文本,p是匹配模式template<typename pattern>int kmp_matcher(const pattern& t, const pattern& p, vector<int>& res){//vector<pattern::size_type> res;vector<int> pai;preprocess(p, pai);int n = t.size();int m = p.size();int k = 0;for (int i = 0; i != n; ++i){while (k != 0 && t[i] != p[k]){k = pai[k - 1];}if (t[i] == p[k]){k = k + 1;if (k == m){res.push_back(i + 1 - m);k = pai[k - 1];}}}return 0;}//对p进行预处理,处理结果记录在pai中,返回处理状态template<typename pattern>int preprocess(const pattern& p, vector<int>& pai){//typedef typename pattern::size_type size_t;int m = p.size();int k = 0;pai.push_back(0);for (int i = 1; i != m; ++i) {while (k != 0 && (p[k] != p[i]))k = pai[k];if (p[k] == p[i])k = k + 1;pai.push_back(k);}return 0;}
0 0
- 字符串匹配
- 字符串匹配
- 字符串匹配
- 字符串匹配
- 字符串匹配
- 字符串匹配
- 字符串匹配...
- 字符串匹配
- 字符串匹配
- 字符串匹配
- 字符串匹配
- 字符串匹配
- 字符串匹配
- 字符串匹配
- 字符串匹配
- 字符串匹配
- 字符串匹配
- 字符串匹配
- angular2入门-第一个angular2 App
- 8月英语—始于足下
- 【C#MVC】搭建.netMVC4工程(四)错误详解-ErrorGeneratingOutput
- 年终总结——驻足赏风景
- 所有节点对之间的最短路问题(All Pair Shortest Path)--《算法导论》
- 字符串匹配
- 对大一的总结
- layer的iframe弹窗,parent.(操作父页面)的使用限制
- Android WebView使用
- 关于Tomcat
- JDBC在getConnection之前为什么要调用Class.forName
- 修改Matlab同m文件的关联
- 用异或操作,实现简单的密码加解密处理
- 【剑指offer】孩子们的游戏(圆圈中最后剩下的数)