字符串匹配算法KMP
2013-03-12 17:29
260 查看
1. 求数组next[j]的算法如下,它只与模式串有关,与目标串无关
2. KMP算法
3. Test program (C)
void cal_next(char *p, int *next, int len) {//important!! array rangs from 0 to len-1 int i = -1, j = 0;//i == -1 means back to the first elem of p[]; next[0] = -1; //except first element, next[j]=k means that before j, there are k elem matched, while(j < len) { if(i == -1 || p[i] == p[j]) {//if p[j] machted, we know that before j+1, there are i elem matched i++; j++; next[j] = i; } else {//go back; i = next[i]; } } } //e.g1: p[] a b c a b c d e // next[j] -1 0 0 0 1 2 3 0 //e.g2: p[] a b a a b c a c // next[j] -1 0 0 1 1 2 0 1
2. KMP算法
int KMP(char* s, char *p, int len) { //array starts with 0; //p is par_string, s is des_string, len is the length of p[]; int i = 0, j = 0;//i point to s[], j point to p[] while(s[i] != '\0' && j < len) {//not meet the end of both arrays if(j == -1 || p[j] == s[i]) {//matched i++; j++; } else {//mismatched j = next[j]; } } if(j == len) {//all matched! printf("\ni = %d, j = %d, match point = %d\n", i, j, i - j); return i - j; } else {//fail to match! printf("no match!\n"); return -1; } }
3. Test program (C)
#include <stdio.h> #include <stdlib.h> #define N 100 int next ; void cal_next(char *p, int *next, int len) {//array rangs from 1 to len-1 int i = -1, j = 0;//i == 0 is invalid next[0] = -1; //except first element, //next[j]=k means that befor j, there are k-1 elem matched while(j < len) { if(i == -1 || p[i] == p[j]) { i++; j++; next[j] = i; } else { i = next[i]; } } //print next[] printf(" %s\n", p); for(i = 0; i < strlen(p); i++) { printf("%d", next[i]); } } int KMP(char* s, char *p, int len) { //array starts with 0; //p is par_string, s is des_string, len is the length of p[]; int i = 0, j = 0;//i point to s[], j point to p[] while(s[i] != '\0' && j < len) {//not meet the end of both arrays if(j == -1 || p[j] == s[i]) {//matched i++; j++; } else {//mismatched j = next[j]; } } if(j == len) {//all matched! printf("\ni = %d, j = %d, match point = %d\n", i, j, i - j); return i - j; } else {//fail to match! printf("\n miss match!\n"); return -1; } } int main() { char *p = "abcabcde";//par_string char *s = "abcdabceabcabcdefabc";//des_string cal_next(p, next, strlen(p)); KMP(s, p, strlen(p)); return 0; }
相关文章推荐
- KMP字符串匹配算法的伪代码
- 字符串匹配算法KMP
- KMP字符串匹配算法
- C语言KMP字符串匹配算法
- KMP-字符串匹配算法
- poj 3461 Oulipo(KMP 字符串匹配算法)
- 字符串匹配算法(KMP)
- KMP 字符串匹配算法
- KMP字符串匹配算法
- 字符串匹配算法(KMP、BM和Sunday),及Python实现
- 算法 字符串匹配算法(朴素模式及KMP模式) java实现
- KMP字符串匹配算法
- 字符串匹配算法(BF和KMP)
- kmp字符串匹配算法实现
- KMP字符串匹配算法
- KMP字符串匹配算法
- KMP字符串匹配算法Java实现
- 【算法题】字符串匹配算法KMP
- KMP字符串匹配算法
- kmp字符串匹配算法