根据算法思路自己实现了kmp算法(未优化)
2017-08-07 16:33
260 查看
贴一下代码,日后再补充。
每一天都在尝试提高对计算机的兴趣,羡慕那些感兴趣、努力并且效率很高的程序员或准程序员,处于尴尬境地的我也只能默默努力!马上就大三了,不想一直高不成低不就的。
/** dandelion
*
* 20170807
* kmp算法
*
*/
#include <iostream>
#include<string>
using namespace std;
/**< len:匹配字符串的长度 */
void getNext(int *next,string shortStr,int len){
/**q:匹配字符串截取长度*/
int q = 2;
for(;q<=len; q++)
{
for(int i=1 ;i<q; i++)
{
if( shortStr.substr(0,i) == shortStr.substr(q-i,i) )/**比较前i位与后i位是否相同*/
next[q-1]=i;/**前后缀相同的长度*/
}
}
}
/**< */
int Kmp(int *next,string longStr,string shortStr,int *rezult ,int lenLong,int lenShort)
{
int i = 0;
int Long = lenLong;
int Short = lenShort;
int loc = 0;/**< len:目标字符串的位置*/
int q = 0;/**< 匹配字符串的位置*/
while(loc<Long)
{
q=0;
while(q<Short)
{
if(longStr[loc]!=shortStr[q])/**< 匹配不成功时,目标字符串位置根据next【】向后移动*/
{
loc=loc-next[q]+1;
break;
}
else
{
q++;
loc++;
}
}
if(q==Short)
rezult[i++]=loc-Short;
}
return i;
}
int main()
{
string longString("babcbabcabcaabcabcabcacabc");
string shortString("abcabcacab");
int lenLong = longString.length();
int lenShort = shortString.length();
int next[lenShort]={0};
int result[20];
getNext(next,shortString,lenShort);/**计算next数组*/
int x = Kmp(next,longString,shortString,result,lenLong,lenShort);
for(int i = 0 ; i < x; i++)
cout<<result[i]<<" ";
//for(int i = 0; i<lenShort; i++)
// cout<<next[i]<<" ";
return 0;
}
每一天都在尝试提高对计算机的兴趣,羡慕那些感兴趣、努力并且效率很高的程序员或准程序员,处于尴尬境地的我也只能默默努力!马上就大三了,不想一直高不成低不就的。
/** dandelion
*
* 20170807
* kmp算法
*
*/
#include <iostream>
#include<string>
using namespace std;
/**< len:匹配字符串的长度 */
void getNext(int *next,string shortStr,int len){
/**q:匹配字符串截取长度*/
int q = 2;
for(;q<=len; q++)
{
for(int i=1 ;i<q; i++)
{
if( shortStr.substr(0,i) == shortStr.substr(q-i,i) )/**比较前i位与后i位是否相同*/
next[q-1]=i;/**前后缀相同的长度*/
}
}
}
/**< */
int Kmp(int *next,string longStr,string shortStr,int *rezult ,int lenLong,int lenShort)
{
int i = 0;
int Long = lenLong;
int Short = lenShort;
int loc = 0;/**< len:目标字符串的位置*/
int q = 0;/**< 匹配字符串的位置*/
while(loc<Long)
{
q=0;
while(q<Short)
{
if(longStr[loc]!=shortStr[q])/**< 匹配不成功时,目标字符串位置根据next【】向后移动*/
{
loc=loc-next[q]+1;
break;
}
else
{
q++;
loc++;
}
}
if(q==Short)
rezult[i++]=loc-Short;
}
return i;
}
int main()
{
string longString("babcbabcabcaabcabcabcacabc");
string shortString("abcabcacab");
int lenLong = longString.length();
int lenShort = shortString.length();
int next[lenShort]={0};
int result[20];
getNext(next,shortString,lenShort);/**计算next数组*/
int x = Kmp(next,longString,shortString,result,lenLong,lenShort);
for(int i = 0 ; i < x; i++)
cout<<result[i]<<" ";
//for(int i = 0; i<lenShort; i++)
// cout<<next[i]<<" ";
return 0;
}
相关文章推荐
- KMP算法代码实现和优化(不太能理解具体的过程和该算法思想)
- KMP算法之最终实现及优化 - 数据结构和算法39
- 根据学校的业务需求,主攻关于高校自动排课的算法实现
- 待更新·优化问题求解算法实现方法·Java版
- 图论;单源最短路径;拓扑排序+松弛(有向无回路);Bellman-Ford(回路,负权回路);Dijkstra(无负权,可回路);可以用最小堆实现算法的优化;
- 自己实现的A*平滑算法
- SSE图像算法优化系列十六:经典USM锐化中的分支判断语句SSE实现的几种方法尝试。
- 算法:并查集的实现及简单优化
- 【笔试题】一个无重复面值的找零算法的思路与实现【方案2】
- 自己实现一个Java框架(一):思路
- 自己编码使用去色、曲线、色阶算法实现照片怀旧特效。
- 高斯模糊算法的实现和优化
- 企鹅2015校招笔试之(一)抽奖算法思路实现
- 安卓微信自己主动抢红包插件优化和实现
- 自己备查:如何优化算法--缓存
- 一个无重复面值的找零算法的思路与实现(二)
- 自己实现一个带引用计数的智能指针,根据源码
- 算法思路重新实现-堆排序 中的 C++ & Java
- 用选择的方式对数组进行排序,并写出对应的优化后的代码实现。(重点写思路、原理)