KMP算法

原创 2015年07月08日 09:55:48
//============================================================================
// Name        : C++Study.cpp
// Author      : pan
// Version     :
// Copyright   : Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================


#include <stdio.h>
#include <cstdlib>
#include <iostream>
#include <queue>
#include <stack>
#include <assert.h>
#include <string.h>
using namespace std;


struct String {


char* s = NULL;
int length = 0;


};
void assignString(String* dst, const char* t) {


assert(t!=NULL);
if (dst->s) {
delete dst->s;
}
int len = strlen(t);
dst->s = new char[len + 1];
dst->s[len] = '\0'; ///////这里好好理解下
for (int i = 0; i < len; i++) {
dst->s[i] = t[i];
dst->length++;
}


}
String* concatString(String* s1, String* s2) {


String* s = new String;
s->s = new char[s1->length + s2->length + 1];
s->s[s1->length + s2->length] = '\0';
int i = 0;
while (s1->s[i] != '\0') {
s->s[i] = s1->s[i];
i++;
}
while (s2->s[i] != '\0') {
s->s[i] = s2->s[i];
i++;
}
s1->s = new char[s1->length + s2->length + 1];
i = 0;
while (s->s[i] != '\0') {
s1->s[i] = s->s[i];
// cout << s->s[i];
i++;
}
s1->s[i] = '\0';
delete s->s;
delete s;
return s1;
}


void showString(String* s) {
int i = 0;
while (s->s[i] != '\0') {
cout << s->s[i];
i++;
}
}


int indexSubString(String* src, String* sub) { //求子串的位置
int i = 0, j = 0;
while (i < src->length && j < sub->length) {
if (src->s[i] == sub->s[j]) {
i++;
j++;
} else {
i = i - j + 1;
j = 0;
}
}
if (j == sub->length)
return i - j + 1;


return 0;
}


void getnext(String* pat, int next[]) {
int k = -1;
int j = 0;
next[0] = -1;
int len = strlen(pat->s);
while (j < len) {
if (k == -1 || pat->s[k] == pat->s[j]) {
next[++j] = ++k;
} else {
k = next[k];
}
}
}
int KMP_find(String* obj, String* pat, int next[]) {//KMP算法
int len1 = strlen(obj->s);
int len2 = strlen(pat->s);
int i = 0, j = 0;
while (i < len1 && j < len2) {
if ((j == -1)||(pat->s[j] == obj->s[i])) {
i++;
j++;
} else {
j = next[j];
}
}
if (j > len2) {
return i - j;
}
return -1;
}
int main() {


/* if('\0'==NULL)
{
cout<<"yes";
}*/
String s1, s2;
char* c = "abcdefg";
assignString(&s1, c);
assignString(&s2, "cde");
String* s = concatString(&s1, &s2);
//showString(s);
int next[strlen(c) + 1];
getnext(&s1, next);
KMP_find(&s1, &s2, next);


delete s1.s;
delete s2.s;
delete s->s;


return 0;
}

飘逸的python - 字符串的KMP匹配算法

首先我们来看一下字符串的朴素匹配. 可以想象成把文本串s固定住,模式串p从s最左边开始对齐,如果对齐的部分完全一样,则匹配成功,失败则将模式串p整体往右移1位,继续检查对齐部分,如此反复. #朴素...
  • u010180339
  • u010180339
  • 2014年11月10日 11:20
  • 4875

从头到尾彻底理解KMP(转载自July)

从头到尾彻底理解KMP 作者:July 时间:最初写于2011年12月,2014年7月21日晚10点 全部删除重写成此文,随后的半个多月不断反复改进。 1...
  • wjy0330
  • wjy0330
  • 2014年09月26日 23:31
  • 1556

KMP算法--c语言实现

KMP算法 字符串不回溯 搜索词不断移位 搜索词移位时查看是否有重复子串 KMP算法过程 1.  首先,字符串”BBC ABCDAB ABCDABCDABDE”的第一个字符与搜索词”ABCDABD”的...
  • zhang0558
  • zhang0558
  • 2015年12月03日 11:02
  • 1576

KMP算法解释

  • 2017年11月29日 11:14
  • 175KB
  • 下载

kmp算法源码

  • 2014年09月20日 20:14
  • 746B
  • 下载

kmp算法详解及练习

  • 2011年03月08日 00:23
  • 209KB
  • 下载

java实现的kmp算法

  • 2013年02月25日 10:21
  • 4KB
  • 下载

KMP算法之代码

  • 2012年02月07日 08:07
  • 2KB
  • 下载

kmp算法--VC6.0

  • 2012年02月22日 09:57
  • 314KB
  • 下载

VC++2012编程演练数据结构《18》KMP算法

  • 2012年11月20日 13:55
  • 4KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:KMP算法
举报原因:
原因补充:

(最多只允许输入30个字)