#include <iostream> #include <windows.h> using namespace std; void get_next(char *str,int *num) { int idFront = 0; int len = strlen(str); int amount = 1; int flag = 0;//相等时一直往下循环 int flag2 = 0;//标记是否在循环过程中不匹配,如果在循环过程中不匹配,则要防止跳过这个数 for(int i = 2;i<len;i++) { do { if(str[i-1] == str[idFront]) { flag2 = 1; num[i] = ++amount; flag = 1;//保证相等就会循环一直循环到不等 i++; idFront++; } else { if(flag2 == 1)//保证在相等循环时最后一个不匹配,然后再与第0个进行比较,避免外层for循环跳过这个不匹配的数 { i--; } flag2 = 0; flag = 0; idFront = 0; amount = 1; } }while(flag == 1); } } void find(char *str,char *substr) { int *next = new int[strlen(substr)]; for(int p=0;p<strlen(substr);p++) { next[p] = 1; } next[0] = 0; get_next(substr,next); int i=0;//i不会回溯 int j=0; int count = 1; while(i<strlen(str) && j < strlen(substr)) { cout << "第" << count++ << "次比较,i = " << i << " j = " << j ; if(str[i] == substr[j]) { cout << " 相等 " << endl; system("pause"); i++; j++; } else { cout << " 不相等 " << endl; system("pause"); if(j>0) { j = next[j] - 1;//下一次i与j比较的位置,可以在纸上画出来然后找出关系 } else { j = 0; i++; } } } int len = strlen(substr); if(j == len) { cout << "找到,位置为" << i-strlen(substr) << endl; } else { cout << "没找到" << endl; } } void main() { char *str = "abcdabcdabcdabceabcdabcabcdadewerwq"; char *substr = "abcdabce"; cout << str << endl; cout << substr << endl; find(str,substr); }