作业-数据结构(c):串匹配-kmp算法

作业:串匹配--kmp算法

/*
实训06-串的匹配模式
题目:在地址:"重庆市沙坪坝区大学城西路虎溪花园70栋1单元17-2"中寻找子串:"虎溪花园"

要求:
1)用顺序结构存储串
2)用简单模式匹配算法寻找子串存在的位置。
3)学习了解KMP算法(选做)。
参考:https://haokan.baidu.com/v?pd=wisenatural&vid=12462272825544877150

运行结果:
已知主串:重庆市沙坪坝区大学城西路虎溪花园70栋1单元17-2
在 12 号位找到子串:虎溪花园

*/

第8周实训课前微信提交“实训5”和“实训6”的算法实现。
BF(BruteForce)暴力解法
#include <stdio.h>
#include <string.h>
int BF(char s[], char t[])
{
	int count = 0;
	int i, j;
	for (i = 0; i < strlen(s); i++) {
		for (j = 0; j < strlen(t); j++) {
			if (s[i + count] == t[j]) {
				count++;
			}
			else {
				break;//如果有一个不匹配就结束当前的内层for循环
			}
		}
		if (count == strlen(t)) {//如果长度匹配够了就停止匹配
			break;
		}
		else {
			count = 0;//重头开始匹配
		}
	}
	if (count == strlen(t)) {
		return i;
	}
	return -1;
}
int main() {
	char s[] = "abcabcdabcde";
	char t[] = "bca";
	int loc = BF(s, t);
	printf("所在位置:%d\n", loc);
	system("pause");
}

KMP算法

我参考的文档

[]: https://www.cnblogs.com/zhangboy/p/7635627.html "KMP算法详解"

推荐视频:

[]: https://www.bilibili.com/video/BV1Px411z7Yo?from=search&seid=1370604567243716102&spm_id_from=333.337.0.0

推荐看这个视频 非常非常棒。
一共分为两部分,上面的链接是第一部分,
#include <stdio.h>
#include <string.h>
/// <summary>
/// 获取匹配串的最大公共前缀表
/// </summary>
/// <param name="str">匹配串</param>
/// <returns>公共前缀表</returns>
int* getNext(char str[]) {
	int len = strlen(str);
	int* next = (int*)malloc(sizeof(int) * len);
	next[0] = -1;//有的教程里这里置为0 都可以的 下面会相应的做些改变
	//printf("%d\t", -1);
	int l = -1, r = 0;
	while (r < len-1) {
		if (l == -1 || str[l] == str[r]) {
			l++;
			r++;
			next[r]=l;
			//printf("%d\t", next[r]);
		}
		else {
			l = next[l];
		}
	}

	return next;
}

int KMP(char orginStr[], char patternStr[]) {
	int oIndex = 0, pIndex = 0;
	int* next = getNext(patternStr);
	int len1 = strlen(orginStr), len2 = strlen(patternStr);
	while (oIndex<len1 && pIndex<len2)
	{
		if (pIndex == -1 || orginStr[oIndex] == patternStr[pIndex]) {
			oIndex++;
			pIndex++;
		}
		else {
			pIndex = next[pIndex];
		}
	}
	if (pIndex == strlen(patternStr)) {
		return oIndex - pIndex;
	}
	return -1;
}

int main() {
	char orginS[] = "重庆市沙坪坝区大学城西路虎溪花园70栋1单元17-2";
	char patternS[] = "虎溪花园";
	int index=KMP(orginS, patternS);
	printf("匹配下标:%d", index);
	system("pause");
}

运行这个结果应该是12 但是结果却是24 这是因为中文一个汉字占两个char类型 若需要对这个结果做处理参考下面这个文章...

[]: https://www.cnblogs.com/noonjuan/p/12319727.html "c char字符汉字处理"

如果不明白这个算法和运行流程的话,可以自行打断点一步一步运行。

断点调试不会的话...留言给我吧、或者私聊也行。

posted @ 2021-10-23 13:02  无涯ha  阅读(116)  评论(0编辑  收藏  举报