KMP算法代码
以下是本人根据上一篇博客随笔http://www.cnblogs.com/jiayouwyhit/p/3251832.html,所写的KMP算法代码(暂未优化),个人认为在基于上一篇博客的基础上,代码的思路是相对很清晰的。以后的KMP算法求解建议依照此版本进行代码构思。再次强调下本版本的next数组:
例如:
// T = a b c a b c a b c d
//下标: 0 1 2 3 4 5 6 7 8 9
//next: -1 0 0 0 1 2 3 4 5 6
该版本的next数组的一个好处在于:字符串的下标是从零开始的,符合C++下string本身的特点;且另next[0]=-1,取值非常巧妙。
//新的KMP算法思路
int myNewKMP(const string& P,const string& T,const int* next)
{
int P_length = P.size(),T_length = T.size();
int i=,q=;//i----主串下标;q---子串下标号 while (i<P_length && q<T_length)
{
if(q==- || P[i]==T[q])
{
++i;
++q;
}
else{
q=next[q];
}
}
if(q==T_length)
return (i-T_length);
else
return -;
} //新的求next数组的思路
//next 数组举例示范:
// T = a b c a b c a b c d
//下标: 0 1 2 3 4 5 6 7 8 9
//next: -1 0 0 0 1 2 3 4 5 6
void myNewNext(const string & T, int *next)
{
int T_length=T.size();
int k=,q=;//k---前缀;q----后缀
next[]=-;
while (q<T_length)
{
if(k==- ||T[q]==T[k])//K==-1说明K=0了,T[k]!=T[q],故需将q往后移动,而K(也就是next[q])取值为0.
{
++q;
++k;
next[q]=k;
}
else
k = next[k];
}
}
//优化后的
void myNewNextUpdate(const string & T, int *next)
{
int T_length=T.size();
int k=,q=;//k---前缀;q----后缀
next[]=-;
while (q<T_length)
{
if(k==- ||T[q]==T[k])//K==-1说明K=0了,T[k]!=T[q],故需将q往后移动,而K(也就是next[q])取值为0.
{
++q;
++k;
//注意:注意这里是++i和++j之后的p[i]、p[j]
//修改:因为如果T[q]==T[k],则假如主串中某个字符与T[q]没有匹配上时,则把该字符与T[k]匹配将仍然是匹配不上的。
if(T[q]!=T[k])
next[q]=k;
else
next[q]=next[k];
}
else
k = next[k];
}
}
int main()
{
int i;
int shift = -;
int next[]={};
string P= "ababxbaaaabaaacfdsss";
string T = "aaabaaac";
cout<<"P="<<P<<endl;
cout<<"T="<<T<<endl; myNewNext(T,next);
if((shift = myNewKMP(P,T,next)) !=-)
cout<<"shift is "<<shift<<endl;
for (i = ; i< T.size(); ++i)
{
printf("%d ",next[i]);
}
printf("\n"); return ;
}
KMP算法代码的更多相关文章
- 【原创】KMP算法代码(C)
//s是模式字符串,t是匹配字符串(可以看我上一篇文章中的叙述) int KMP(const char * s , const char * t) { int slen = strlen(s) , t ...
- Java KMP算法代码
1. KMP 算法(字符串匹配算法)较 BF(朴素的字符串匹配)算法有哪些改进 1) 在主串和子串匹配的过程中,主串不再回退,只改变子串的比较位置. 2) 为子串生成对应的next数组,每次匹配失败, ...
- 【编程练习】kmp算法代码
代码来自: http://blog.csdn.net/v_JULY_v #include "StdAfx.h" #include <iostream> using na ...
- KMP算法以及优化(代码分析以及求解next数组和nextval数组)
KMP算法以及优化(代码分析以及求解next数组和nextval数组) 来了,数据结构及算法的内容来了,这才是我们的专攻,前面写的都是开胃小菜,本篇文章,侧重考研408方向,所以保证了你只要看懂了,题 ...
- kmp算法简明教程
在字符串s中寻找模式串p的位置,这是一个字符串匹配问题. 举例说明: i = 0 1 2 3 4 5 6 7 8 9 10 11 12 13 s = a b a a c a b a a a b a a ...
- 查找子字符串----KMP算法深入剖析
假设主串:a b a b c a b c a c b a b 子串:a b c a c 1.一般匹配算法 逐个字符的比较,匹配过程如下: 第一趟匹配 a b a b c a b c a c ...
- 利用KMP算法解决串的模式匹配问题(c++) -- 数据结构
题目: 7-1 串的模式匹配 (30 分) 给定一个主串S(长度<=10^6)和一个模式T(长度<=10^5),要求在主串S中找出与模式T相匹配的子串,返回相匹配的子串中的第一个字符在主串 ...
- 字符串模式匹配算法1 - BF和KMP算法
在字符串S中定位/查找某个子字符串P的操作,通常称为字符串的模式匹配,其中P称为模式串.模式匹配有多种算法,这里先总结一下BF算法和KMP算法. 注意:本文在讨论字符位置/指针/下标时,全部使用C语法 ...
- kmp算法模板及理解
kmp算法是复杂度为O(n+m)的字符串匹配算法; 首先kmp算法的核心是在模式串中获得next数组,这个数组表示模式串的子串的前缀和后缀相同的最长长度; 这样在匹配的过程中如果指到不匹配的位置,模式 ...
随机推荐
- Java for LeetCode 209 Minimum Size Subarray Sum
Given an array of n positive integers and a positive integer s, find the minimal length of a subarra ...
- jquery 中的一写常用方法
$('form').submit(); // 表单提交 window.parent.location.reload(); // 子窗口刷新父页面 window.location.reload(); / ...
- 【sqlite】python备份数据库
备份整个数据库的方法: # coding=utf-8 import sqlite3 def testBakSqlite(): conn = sqlite3.connect("sqlite_d ...
- idea 用maven骨架生成项目速度慢的问题
使用mvn archetype:generate命令时,加上-DarchetypeCatalog=local archetypeCatalog=local
- pmap
.[root@localhost security]# pmap -d : -bash Address Kbytes Mode Offset Device Mapping r-x-- : bash b ...
- 检查Android系统版本
<script type="text/javascript"> $(function(){ var userAgent = navigator.userAgent; v ...
- UVa1593_Allgnment_Of_Code
/** start: integer; // begins hear stop: integer; // ends here s: string; c: char; // temp **/ //测试数 ...
- Mysql Condition /Handler(异常处理)
关于介绍,可参见:http://www.cnblogs.com/end/archive/2011/04/01/2001946.html. http://blog.csdn.net/rdarda/art ...
- iOS 8 AutoLayout与Size Class
转自:http://www.cocoachina.com/ios/20141217/10669.html 前言 iOS8 和iPhone6发布已经过去蛮久了,广大的果粉终于迎来了大屏iPhone,再也 ...
- NYOJ之算菜价
Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE /* Style Definitions */ table.MsoNormalTable ...