KMP算法 NEXT数组的两种形式
2012-12-21 10:01
225 查看
转载自:http://blog.csdn.net/hackbuteer1/article/details/7319115
http://blog.csdn.net/hackbuteer1/article/details/7319115
NEXT数组有两种形式
1. NEXT数组可以找到当前字符之前的字符串的最长非重叠最长子字符串串的长度
2. NEXT数组可以找到从第一个字符到最后一个字符的最长重复最长子字符串的长度
参考一下的代码:
class CKMP
{
public:
explicit CKMP(char* s1,char *p1);
virtual ~CKMP();
public:
void getNext_1();//匹配字符串时候的next 对应1
void getNext_2();//查找最长重复子串时候的Next 对应2
int KMPMatch();
int *getNext(){return next;}
private:
char s[10000];//目标字符串
char p[1000];//模式串
int next[1000];//next数组
};
运行的截图:
http://blog.csdn.net/hackbuteer1/article/details/7319115
NEXT数组有两种形式
1. NEXT数组可以找到当前字符之前的字符串的最长非重叠最长子字符串串的长度
2. NEXT数组可以找到从第一个字符到最后一个字符的最长重复最长子字符串的长度
参考一下的代码:
class CKMP
{
public:
explicit CKMP(char* s1,char *p1);
virtual ~CKMP();
public:
void getNext_1();//匹配字符串时候的next 对应1
void getNext_2();//查找最长重复子串时候的Next 对应2
int KMPMatch();
int *getNext(){return next;}
private:
char s[10000];//目标字符串
char p[1000];//模式串
int next[1000];//next数组
};
CKMP::CKMP(char *s1,char *s2) { memset(s,0,10000*sizeof(char)); memset(p,0,1000*sizeof(char)); memset(next,0,1000*sizeof(int)); strcpy(s,s1); strcpy(p,s2); } CKMP::~CKMP() { } void CKMP::getNext_1() {//p为模式串 计算模式串p的next memset(next,0,sizeof(next)); int j,k; next[0]=-1; j=0; k=-1; while(j<strlen(p)-1) { if(k==-1||p[j]==p[k]) { k++; j++; next[j]=k; } else k=next[k]; } } int CKMP::KMPMatch() { int i,j; i=0;j=0; getNext_1();//计算模式串p的next while(i<strlen(s))//s为目标串 { if(j==-1||s[i]==p[j]) {//当j==-1的时候,匹配出错,目标串从右移一位 模式串从头开始匹配 i++; j++; } else { j=next[j]; } if(j==strlen(p)) {//如果模式串p的长度等于j 找到了匹配的字符串 return i-strlen(p);//返回匹配的首地址下标 } } return -1; } //获得重复字符串的长度next 从i开始到最后一个字符结束的最长重复串,读取next[len]就可以 void CKMP::getNext_2() {//获得模式串的next数组 memset(next,0,sizeof(next)); int i=0,j=-1; next[0]=-1; while(p[i]!='\0')//模式串p { if(j==-1||p[i]==p[j]) { j++;i++; if(p[i]!=p[j]) next[i]=j;//匹配失败时候 就赋值 else next[i]=next[j]; } else j=next[j]; } }
运行的截图:
相关文章推荐
- KMP算法中的两种next数组:next和nextval
- 超详细理解:kmp算法next数组求解过程和回溯的含义
- 通俗讲解KMP算法和next数组求解
- KMP算法的next数组
- KMP算法中的next数组求解示意图
- KMP算法中的next数组
- KMP算法之NEXT数组代码原理分析 - 数据结构和算法38
- KMP算法求next数组和nextval数组的简单方法
- KMP算法之NEXT数组原理分析
- KMP算法java版,next数组求法简单易懂
- 字符串匹配——KMP算法中的next数组理解
- KMP算法之next数组分析
- KMP算法中next数组的构建
- KMP算法的前缀next数组最通俗的解释,如果看不懂我也没辙了
- kmp算法对应next数组中核心while部分的剖析
- POJ 1961 Period KMP算法next数组的应用
- 算法学习笔记(四) KMP算法之 next 数组详解
- 【kmp算法next数组求解公共前后缀】Seek the Name, Seek the Fame POJ - 2752
- 【kmp算法next数组应用】Simpsons’ Hidden Talents HDU - 2594
- KMP算法之NEXT数组代码原理分析 - 数据结构和算法38