#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字符串查找算法的更多相关文章

  1. 字符串类——KMP子串查找算法

    1, 如何在目标字符串 s 中,查找是否存在子串 p(本文代码已集成到字符串类——字符串类的创建(上)中,这里讲述KMP实现原理) ? 1,朴素算法: 2,朴素解法的问题: 1,问题:有时候右移一位是 ...

  2. KMP 算法 & 字符串查找算法

    KMP算法 Knuth–Morris–Pratt algorithm 克努斯-莫里斯-普拉特 算法 algorithm kmp_search: input: an array of character ...

  3. 第四十一课 KMP子串查找算法

    问题: 右移的位数和目标串没有多大的关系,和子串有关系. 已匹配的字符数现在已经有了,部分匹配值还没有. 前六位匹配成功就去查找PMT中的第六位. 现在的任务就是求得部分匹配表. 问题:怎么得到部分匹 ...

  4. 数据结构开发(14):KMP 子串查找算法

    0.目录 1.KMP 子串查找算法 2.KMP 算法的应用 3.小结 1.KMP 子串查找算法 问题: 如何在目标字符串S中,查找是否存在子串P? 朴素解法: 朴素解法的一个优化线索: 示例: 伟大的 ...

  5. Rabin-Karp字符串查找算法

    1.简介 暴力字符串匹配(brute force string matching)是子串匹配算法中最基本的一种,它确实有自己的优点,比如它并不需要对文本(text)或模式串(pattern)进行预处理 ...

  6. Rabin-Karp指纹字符串查找算法

    首先计算模式字符串的散列函数, 如果找到一个和模式字符串散列值相同的子字符串, 那么继续验证两者是否匹配. 这个过程等价于将模式保存在一个散列表中, 然后在文本中的所有子字符串查找. 但不需要为散列表 ...

  7. 字符串查找算法的改进-hash查找算法

    字符串查找即为特征查找: 特征即位hash: 1.将待查找的字符串hash: 2.在容器字符串中找头字符匹配的字符串,并进行hash: 3.比较hash的结果:相同即位匹配: hash算法的设计为其中 ...

  8. 字符串查找算法总结(暴力匹配、KMP 算法、Boyer-Moore 算法和 Sunday 算法)

    字符串匹配是字符串的一种基本操作:给定一个长度为 M 的文本和一个长度为 N 的模式串,在文本中找到一个和该模式相符的子字符串,并返回该字字符串在文本中的位置. KMP 算法,全称是 Knuth-Mo ...

  9. 第41课 kmp子串查找算法

    1. 朴素算法的改进 (1)朴素算法的优化线索 ①因为 Pa != Pb 且Pb==Sb:所以Pa != Sb:因此在Sd处失配时,子串P右移1位比较没有意义,因为前面的比较己经知道了Pa != Sb ...

随机推荐

  1. ES TransportClient demo

    import java.net.InetAddress; import java.net.UnknownHostException; import org.elasticsearch.action.b ...

  2. zzulioj--1769--去师院的旅程:能怎么走(三)(0.0)

    1796: 去师院的旅程:能怎么走(三) Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 404  Solved: 200 SubmitStatusWe ...

  3. 修改WebAPI路由控制访问

    1.方式一:修改RouteConfig.cs文件 2.方式二:通过在方法上方添加[Route("api/XXXX")]来控制

  4. T7314 yyy的巧克力(钟)

    题目描述 输入输出格式 输入格式: 如图 输出格式: 如图 输入输出样例 输入样例#1: 如图 输出样例#1: 如图 说明 如图 n*m-1 我们可以这样想,1*1的巧克力一定是由1*2的掰开的 #i ...

  5. 一个vue的全局提示框组件

    <template> <!-- 全局提示框 --> <div v-show="visible" class="dialog-tips dia ...

  6. onTouchEvent事件

    @Override public boolean onTouchEvent(MotionEvent event) { if(event.getAction() == MotionEvent.ACTIO ...

  7. DataTables入门

    转载 https://blog.csdn.net/gfd54gd5f46/article/details/65938189

  8. iOS保持流畅有哪些秘诀? 除了黑科技GPU还有这些重要原因 期待安卓8.0流畅度逆袭

    经常有人提起iPhone使用起来要比Android手机流畅,现在谈谈为什么iOS使用中会让人觉得更加流畅一些.一方面iPhone的顶级硬件为iOS的流畅打好了基础,另一方面,专一定制的系统是保证体验的 ...

  9. uva 11300 Spreading the Wealth_数学推倒 + 思维

    这道题和负载平衡问题是同一道题, 如果 n<=100n <= 100n<=100 的话是可以用最小费用流来求解的. 但是题中 nnn 最大可达到 10610^6106, 这就需要我们 ...

  10. 系统中 CPU 时间片是多久

    Windows 系统中线程轮转时间也就是时间片大约是20ms,如果某个线程所需要的时间小于20ms,那么不到20ms就会切换到其他线程:如果一个线程所需的时间超过20ms,系统也最多只给20ms,除非 ...