您的位置:首页 > 其它

根据算法思路自己实现了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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法 kmp