字符串匹配中最简单的算法:
基本思路:wandderwonder
wonder
建立256个长的next数组,记录每个字符最后一次出现的位置。
设mark1 = 0; 和 mark2 = 0;flag = mark1;两个串从头开始出发,到第二个字符不相等,那么一定不是第一个字符开始的字符串,mark1向后移动len2 个,即为e 。看匹配字符串的e最后出现的位置,根据该位置找到如果此位置是匹配串的头,flag标记,mark = 0,继续比较。。。
代码:
int* GetNext(char* st) { int len = strlen(st); int* next = (int*)malloc(sizeof(int)*256); memset(next,-1,sizeof(int)*256); for(int i = 0; i < len; i++) { next[st[i]] = i; } return next; } int Sunnay(char* str,char* st) { int *next = GetNext(st); int len1 = strlen(str); int len2 = strlen(st); int mark1 = 0; int mark2 = 0; int flag = 0; while((mark1<len1) && (mark2<len2)) { if(str[mark1] == st[mark2]) { mark1++; mark2++; } else { flag += len2; if(flag >=len1) break; flag = flag - next[str[flag]]; mark1 = flag; mark2 = 0; } } if(mark2 == len2) { return mark1 - len2; } else //(mark1 == len1) return -1; }