KMP模板
2015-11-06 20:38
337 查看
//优化过后的next 数组求法 void GetNextval(char* p, int next[]) { memset(next,0,sizeof(next)); int pLen = strlen(p); next[0] = -1; int k = -1; int j = 0; while (j < pLen - 1) { //p[k]表示前缀,p[j]表示后缀 if (k == -1 || p[j] == p[k]) { ++j; ++k; //较之前next数组求法,改动在下面4行 if (p[j] != p[k]) next[j] = k; //之前只有这一行 else //因为不能出现p[j] = p[ next[j ]],所以当出现时需要继续递归,k = next[k] = next[next[k]] next[j] = next[k]; } else { k = next[k]; } } } int KmpSearch(char* s, char* p) { int i = 0; int j = 0; int sLen = strlen(s); int pLen = strlen(p); GetNextval(p,next); while (i < sLen && j < pLen) { //①如果j = -1,或者当前字符匹配成功(即S[i] == P[j]),都令i++,j++ if (j == -1 || s[i] == p[j]) { i++; j++; } else { //②如果j != -1,且当前字符匹配失败(即S[i] != P[j]),则令 i 不变,j = next[j] //next[j]即为j所对应的next值 j = next[j]; } } if (j == pLen) return i - j; else return -1; }
相关文章推荐
- 关于手机屏幕信息的获取
- 13 Roman to Integer
- SpringMVC 学习系列 (5) 之 数据绑定 -2
- Kinect+Unity之手势识别初探
- C#实现插入排序算法(Insection Sort)
- RelativeLayout属性
- ul li span addClass removeClass
- swift 2.0 语法 函数
- swift 2.0 语法 字符串
- java的相关特性理解
- /etc/profile、/etc/bashrc、~/.bash_profile、~/.bashrc
- SpringMVC 学习系列 (4) 之 数据绑定 -1
- swift 2.0 语法 字典
- swift 2.0 语法 数组
- 收心收心收心 回归CSDN
- 译:2015年前5名pythonGUI框架
- mysql存储过程详解
- ios 原生二维码扫描以及需要注意事项
- SpringMVC 学习系列 (3) 之 URL请求到Action的映射规则
- HTTP Referer 防外链