KMP相关算法
来源:互联网 发布:99客服软件 编辑:程序博客网 时间:2024/06/08 09:05
KMP算法
KMP算法的关键是利用相同真前后缀的长度来减少搜索的次数,提高效率
未优化版
void GetNext (string P, int next[]) { int p_len = P.size(); int i = 0; int j = -1; next[0] = -1; while (i < p_len) { if (j == -1 || P[i] == P[j]) { i++; j++; next[i] = j; } else { j = next[j]; } }}int KMP (string S, string T, int next[]) { GetNext (T, next); int s_len = S.size(); int t_len = T.size(); int i = 0; int j = 0; while (j < t_len && i < s_len) { if (j==-1 || S[i] == T[j]) { i++; j++; } else { j = next[j]; } } if (j == t_len) { return i - j; } else { return -1; }}
优化版
void GetNext (string P, int nextval[]) { int p_len = P.size(); int i = 0; int j = -1; nextval[0] = -1; while (i < p_len) { if (j == -1 || P[i] == P[j]) { i++; j++; if (P[i] != P[j]) { nextval[i] = j; } else { nextval[i] = nextval[j]; } } else { j = nextval[j]; } }}int KMP (string S, string T, int nextval[]) { GetNext (T, nextval); int s_len = S.size(); int t_len = T.size(); int i = 0; int j = 0; while (j < t_len && i < s_len) { if (j==-1 || S[i] == T[j]) { i++; j++; } else { j = nextval[j]; } } if (j == t_len) { return i - j; } else { return -1; }}
扩展KMP算法
void GetNext (char T[], int t_len, int next[]) { int a = 0, p = 0; next[0] = t_len; for(int i = 1; i < t_len; i++) { if (p <= i || i + next[i - a] >= p) { if (p <= i) { p = i; } while (p < t_len && T[p] == T[p - i]) { p++; } next[i] = p - i; a = i; } else { next[i] = next[i - a]; } }}
参考文献:
[1]:KMP 算法(1):如何理解 KMP
阅读全文
0 0
- KMP及相关算法
- KMP算法相关
- KMP相关算法
- KMP算法的相关证明
- KMP算法相关学习资料
- KMP算法及相关问题的总结
- KMP算法总结及相关例题
- 算法学习【3】字符串相关含KMP算法
- 算法相关——KMP算法最通俗易懂的解释
- kmp相关
- kmp相关
- 【笔记】KMP算法相关计算题(选择题)
- KMP算法详解 【KMP】
- 【KMP】KMP算法模板
- KMP hihoCoder1015 KMP算法
- kmp算法
- KMP算法
- KMP算法
- k-近邻算法小结
- Java NIO:NIO概述
- Matlab局部放大_20170815
- Struts2动态方法报错
- Mysql 报错Packets larger than max_allowed_packet are not allowed
- KMP相关算法
- HBase判断表是否存在
- map函数
- linux进程之fork函数
- SPFA
- javascript:除去数组的重复项
- Python实现:利用GBDT产生新特征(GBDT+Linear Regression)
- Java并发编程:Thread类的使用
- 向花生壳上传自己的网站