KMP字符串查找算法
#include <iostream>
#include <windows.h>
using namespace std; void get_next(char *str,int *num)
{
int idFront = ;
int len = strlen(str);
int amount = ;
int flag = ;//相等时一直往下循环
int flag2 = ;//标记是否在循环过程中不匹配,如果在循环过程中不匹配,则要防止跳过这个数 for(int i = ;i<len;i++)
{
do
{
if(str[i-] == str[idFront])
{
flag2 = ;
num[i] = ++amount;
flag = ;//保证相等就会循环一直循环到不等
i++;
idFront++;
}
else
{
if(flag2 == )//保证在相等循环时最后一个不匹配,然后再与第0个进行比较,避免外层for循环跳过这个不匹配的数
{
i--;
}
flag2 = ;
flag = ;
idFront = ;
amount = ;
}
}while(flag == );
}
} void find(char *str,char *substr)
{
int *next = new int[strlen(substr)];
for(int p=;p<strlen(substr);p++)
{
next[p] = ;
}
next[] = ; get_next(substr,next); int i=;//i不会回溯
int j=;
int count = ;
while(i<strlen(str) && j < strlen(substr))
{
cout << "第" << count++ << "次比较,i = " << i << " j = " << j ; if(str[i] == substr[j])
{
cout << " 相等 " << endl;
system("pause");
i++;
j++;
}
else
{
cout << " 不相等 " << endl;
system("pause");
if(j>)
{
j = next[j] - ;//下一次i与j比较的位置,可以在纸上画出来然后找出关系
}
else
{
j = ;
i++;
}
}
} int len = strlen(substr);
if(j == len)
{
cout << "找到,位置为" << i-strlen(substr) << endl;
}
else
{
cout << "没找到" << endl;
}
} void main()
{
char *str = "abcdabcdabcdabceabcdabcabcdadewerwq";
char *substr = "abcdabce";
cout << str << endl;
cout << substr << endl;
find(str,substr);
}
KMP字符串查找算法的更多相关文章
- 字符串类——KMP子串查找算法
1, 如何在目标字符串 s 中,查找是否存在子串 p(本文代码已集成到字符串类——字符串类的创建(上)中,这里讲述KMP实现原理) ? 1,朴素算法: 2,朴素解法的问题: 1,问题:有时候右移一位是 ...
- KMP 算法 & 字符串查找算法
KMP算法 Knuth–Morris–Pratt algorithm 克努斯-莫里斯-普拉特 算法 algorithm kmp_search: input: an array of character ...
- 第四十一课 KMP子串查找算法
问题: 右移的位数和目标串没有多大的关系,和子串有关系. 已匹配的字符数现在已经有了,部分匹配值还没有. 前六位匹配成功就去查找PMT中的第六位. 现在的任务就是求得部分匹配表. 问题:怎么得到部分匹 ...
- 数据结构开发(14):KMP 子串查找算法
0.目录 1.KMP 子串查找算法 2.KMP 算法的应用 3.小结 1.KMP 子串查找算法 问题: 如何在目标字符串S中,查找是否存在子串P? 朴素解法: 朴素解法的一个优化线索: 示例: 伟大的 ...
- Rabin-Karp字符串查找算法
1.简介 暴力字符串匹配(brute force string matching)是子串匹配算法中最基本的一种,它确实有自己的优点,比如它并不需要对文本(text)或模式串(pattern)进行预处理 ...
- Rabin-Karp指纹字符串查找算法
首先计算模式字符串的散列函数, 如果找到一个和模式字符串散列值相同的子字符串, 那么继续验证两者是否匹配. 这个过程等价于将模式保存在一个散列表中, 然后在文本中的所有子字符串查找. 但不需要为散列表 ...
- 字符串查找算法的改进-hash查找算法
字符串查找即为特征查找: 特征即位hash: 1.将待查找的字符串hash: 2.在容器字符串中找头字符匹配的字符串,并进行hash: 3.比较hash的结果:相同即位匹配: hash算法的设计为其中 ...
- 字符串查找算法总结(暴力匹配、KMP 算法、Boyer-Moore 算法和 Sunday 算法)
字符串匹配是字符串的一种基本操作:给定一个长度为 M 的文本和一个长度为 N 的模式串,在文本中找到一个和该模式相符的子字符串,并返回该字字符串在文本中的位置. KMP 算法,全称是 Knuth-Mo ...
- 第41课 kmp子串查找算法
1. 朴素算法的改进 (1)朴素算法的优化线索 ①因为 Pa != Pb 且Pb==Sb:所以Pa != Sb:因此在Sd处失配时,子串P右移1位比较没有意义,因为前面的比较己经知道了Pa != Sb ...
随机推荐
- docker中出现容器未运行无法进入容器的操作
- ContentType 列表
CONTENTTYPE是html里面都带有的,ASP只是设置当前的CONTENTTYPE在浏览器中,ContentType一般指定当前的文档内容,浏览器即根据相应的MIME及Content-Type映 ...
- 再生龙恢复分区后修复引导或debian linux修复引导 三部曲
先参考 sudo -imkdir /mntmount /dev/sda1 /mntgrub-install --force --no-floppy --root-directory=/mnt /dev ...
- Kattis - How Many Digits?
How Many Digits? Often times it is sufficient to know the rough size of a number, rather than its ex ...
- LeetCode Golang 5. 最长回文子串
5. 最长回文子串 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 示例 1: 输入: "babad" 输出: "bab&quo ...
- LeetCode Golang 单向链表相加 反向实现
LeetCode 两数之和, 反向实现 1 -> 2 -> 3 -> 4 + 3 -> 4 ------------------------- ...
- luogu P3387 【模板】缩点_拓扑排序
还是很好些的. Code: #include <stack> #include <cstdio> #include <algorithm> #include < ...
- 连连看 HDU - 1175_搜索_剪枝
hdu有毒,考试上 AC 的就是一直 WA- 其实这道题是可以进行初始化来进行优化的,这样的话询问次数是可以达到 10510^5105 的.不过普通的 dfsdfsdfs + 剪枝也是可过的. Cod ...
- ansible yum 模块 安装 vsftp
[root@ftp:/root] > ansible ansible01 -u root -k -m yum -a 'name=vsftpd state=latest' SSH password ...
- [luogu] P4040 [AHOI2014/JSOI2014]宅男计划(贪心)
P4040 [AHOI2014/JSOI2014]宅男计划 题目背景 自从迷上了拼图,JYY就变成了个彻底的宅男.为了解决温饱问题,JYY不得不依靠叫外卖来维持生计. 题目描述 外卖店一共有N种食物, ...