串的应用-KMP算法求next数组

93 阅读1分钟

求next数组

void getNext(string str, int* next)
{
	// next[i]的求解方法是,找到从str[0]~str[i-1]的公共最长匹配前缀和后缀的长度
	next[0]=-1;  // next[0]定义为-1
	next[1]=0;	 // next[1]肯定是0
	// 只要待匹配串还没到底,都要求相应位的next[i]值
	int i=2;
	while(i<str.length()){
		int max_len=i-1;		// 最长长度为i-1
		int len,j;
		for (len = max_len;len >= 1;len--)  // 从最长的情况开始搜索
		{
			for (j = 0;j < len;j++)
			{
				if(str[j]!=str[j+i-len])  // 只要有任何一位不对应相等,那么当前len就不成立,试探下一个len 
					break;
			}
			// 如果上一个循环是正常退出,即都对应相等了,那就把当前的len赋给next[i],并不再往下试探了
			if(j==len)  
			{
				next[i]=len;
				break;
			}
		}
		if (len < 1)  // 如果len=1的情况都不成立,那next[i]肯定是0了
		{
			next[i]=0;
		}
		i++;
	}
}