KMP算法
一、算法背景 给定一个主串(以 S 代替)和模式串(以 P 代替),要求找出 P 在 S 中出现的位置,此即串的模式匹配问题。 Knuth-Morris-Pratt 算法(简称 KMP)是解决这一问题的常用算法之一,这个算法是由高德纳(Donald Ervin Knuth)和沃恩·普拉特在1974年构思,同年詹姆斯·H·莫里斯也独立地设计出该算法,最终三人于1977年联合发表。 在继续下面的内容之前,有必要在这里介绍下两个概念: 真前缀 和 真后缀 。 由上图所得, "真前缀"指除了自身以外,一个字符串的全部头部组合;"真后缀"指除了自身以外,一个字符串的全部尾部组合。 二、暴力匹配 这个算法的复杂度是O(n*m) 1 // n是P的长度,m是S的长度,返回P在S中出现的次数 2 int solve(char P[],int n,char S[],int m) // P是模式串,S是主串 3 { 4 int ans = 0; 5 int i,j; 6 for (i=0;i+n<=m;i++) 7 { 8 for (j=0;j<n;j++) 9 { 10 if (S[i+j] != P[j]) 11 break; 12 } 13 if (j == n) 14 ans++; 15 } 16 return ans; 17 } 三:KMP字符串匹配算法