美妙的字符串之KMP算法
概述 讲解非常非常详细的KMP算法 在S串中查找P串的位置所在 暴力算法:S:i, P:j 若s[i] == p[j],i++,j++; 若s[i]!=p[j], i = i-(j-1)+1, j = 0; 之前的已匹配段回溯肯定导致失配,因为p[0]!=p[last(当前不匹配的j位置)-1]; KMP算法:i不回退,只需要移动j。 1. 对模式串进行处理:next[j]是不匹配时的j下一步回溯位置,取决于当前字符的字符串中有最大长度的相同前缀后缀。 2. 对模式串P的处理:i从0-plen-1,遍历得到next[], 当某个字符失配时,该字符对应的next值会告诉你下一步匹配中,模式串应该跳到那个位置,如果next[j] = 0或者-1,则跳到模式串的开头字符,若next[j] = k 且k>0,代表下次匹配跳到j之前的某个字符,而不是跳到开头,且具体调过来k个字符。 int next[1000000+100]; void kmp_pre(char x[], int n){ int i, j; i= 0; j = next[0] = -1; while(i < n){ while(j!=-1 && x[i]!=x[j]) j = next[j]; next[++i] = ++j; } } int KmpSearch(char *s, char *p){ int i =0;