作业-数据结构(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算法详解"
推荐视频:
推荐看这个视频 非常非常棒。
一共分为两部分,上面的链接是第一部分,
#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字符汉字处理"
如果不明白这个算法和运行流程的话,可以自行打断点一步一步运行。
断点调试不会的话...留言给我吧、或者私聊也行。