【2-1】DS-串-学习

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhoulei_061/article/details/85111176

串的朴素算法:

  • 一个一个从给定的主串的起始位置开始,从子串的开头一个一个对应匹配过去,若遇到不相等的元素,主串的搜索起始点回到起始点的下一个,子串的搜索起始点回到开头,再进行匹配。(将主串和子串的一维数组的X[0]保存为该串的长度,可以进行匹配的条件是给定的主串起始位置应<=主串的长度,子串同理)

KMP算法: 

  • 有种智能匹配的感觉,重点在有一个Next数组,可以少干很多不必要的、重复的匹配(少走回头路,Next数组即一个记录字符串最长公共前后缀的数组,发现不匹配了再从上一次匹配的位置出发进行搜索)

Next数组:

  

#include<stdio.h>
#include<string.h>
#define MAXSIZE 100001
void Next(char *T, int *next)/*Next数组*/
{
	int i, j;
	j = 0;
	next[0] = 0;
	for(i = 1;i<strlen(T);i++)
	{
		while(j!=0 && T[i]!=T[j])
		{/*不匹配回滚*/
			j = next[j];
		}
		if(T[i]==T[j])
		{
			j++;
		}
		next[i] = j;
	}
}
int main()
{
	int i;
	char T[MAXSIZE];
	int next[MAXSIZE];
	scanf("%s", &T);
	Next(T, next);
	for(i = 0;i<strlen(T);i++)
	{
		printf("%d ",next[i]);
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/zhoulei_061/article/details/85111176
2-1
今日推荐