心胸决定格局,眼界决定境界...

kmp

void next_data(char mode[], int* next)
{
	int i = 0;
	int k = 0;
	next[0] = 0;
	int str_len2 = strlen(mode);
	for (i = 1; i < str_len2; i++)//i 是遍历next的各个元素位置,同时也是不同的长度
	{
		while (mode[i] != mode[k] && k >= 1)//k是从0开始,且匹配到的元素个数
		{
			k = next[k - 1];
		}
		if (mode[i] == mode[k])
		{
			k++;
		}
		next[i] = k;
	}

}


void kmp(char* data, char* match)//未匹配到返回-1,匹配到返回坐标位置;  如果有多个,再讨论
{
	int str_len1 = strlen(data);
	int str_len2 = strlen(match);
	int* next = (int*)malloc(sizeof(int)*str_len2);
	next_data(match, next);
	int i = 0;
	int j = 0;
	for (int i = 0; i < str_len1; i++)
	{
		while (data[i] != match[j] && j >= 1)
		{
			j = next[j - 1];
		}

		if (data[i] == match[j])
		{
			j++;
		}
		if (j == str_len2)
		{
			cout << "find:" << "pos:" << i - str_len2 + 1 << endl;
			//return (i - str_len2 + 1);			
			j = 0;//打印出所有的位置
		}
	}

	if (next)
	{
		free(next);
		next = NULL;
	}

}


	//1.暴力两次循环
	//2.kmp
	//1)next 数组
	char data[] = "abcdefcdghcd";
	char mode[] = "cd";
	kmp(data, mode);

  

posted @ 2019-02-11 15:48  WELEN  阅读(166)  评论(0)    收藏  举报