KMP算法字符串查找子串
题目:
经典的KMP算法
分析:
和KMP算法对应的是BF算法,其中BF算法时间复杂度,最坏情况下可以达到O(n*m),而KMP算法的时间复杂度是O(n + m),所以,KMP算法效率高很多。
但是KMP算法不太好理解,其中牵涉到next数组,目标就是让模式串尽可能的往右滑动,减少比较次数,比如
a b a b c
-1 0 0 1 2
比如我们比较ababc时,如果c比较发现错误,前面的abab已经比较成功,那么下次比较,我们只需要从aba的最后一个a开始比较,这样省去了从头开始比较。
算法代码:
- #include <iostream>
- #include <cstdlib>
- #include <cstdio>
- using namespace std;
- //这是整个kmp中最核心的地方
- int get_next(const char*t, int *next)
- {
- int i = 0;
- int j = -1; //设置j = -1,非常巧妙
- int len = strlen(t);
- memset(next,0, sizeof(int) * len);
- next[0] = -1;
- while(i < len - 1)
- {
- if(j == -1 || t[i] == t[j]) //前面的判断,j == -1, 非常巧妙
- {
- i++;
- j++;
- next[i] = j; //将后面的next数组元素赋值
- }
- else
- j = next[j];
- }
- }
- int kmp(const char *s, const char *t)
- {
- int i = 0;
- int j = 0;
- int next[100];
- get_next(t,next);
- while(i < strlen(s) && j < strlen(t))
- {
- if(j == - 1 || s[i] == t[j]) //如果j为-1,或者模式串和主串相等,两者继续往下比较
- {
- i++;
- j++;
- }
- else
- j = next[j];
- }
- if(j >= (int)strlen(t))
- {
- cout << "found " << endl;
- return 0;
- }
- cout << "not found" <<endl;
- return 0;
- }
- //暴力法
- int brute_force(const char *s, const char *t)
- {
- int i, j;
- i = 0;
- while(i < strlen(s))
- {
- j = 0;
- while(j < strlen(t))
- {
- if(s[i] == t[j])
- {
- i++;
- j++;
- }
- else
- {
- i = i - j + 1;
- break;
- }
- }
- if(j == (int)strlen(t))
- {
- cout << "found" << endl;
- return 0;
- }
- }
- cout << "not found" << endl;
- return 0;
- }
- int main()
- {
- brute_force("abcdef", "abcdef");
- kmp("abcdef", "aaaa");
- return 0;
- }
总结:
KMP算法非常经典,同时这个算法实现很多地方非常巧妙。
优化思路
|
下标i
|
0
|
1
|
2
|
3
|
4
|
5
|
6
|
7
|
8
|
9
|
|
p(i)
|
a
|
b
|
c
|
d
|
a
|
a
|
b
|
c
|
a
|
b
|
|
next[i]
|
-1
|
0
|
0
|
0
|
0
|
1
|
1
|
2
|
3
|
1
|
|
下标i
|
0
|
1
|
2
|
3
|
4
|
5
|
6
|
7
|
8
|
9
|
|
p(i)
|
a
|
b
|
c
|
d
|
a
|
a
|
b
|
c
|
a
|
b
|
|
next[i]
|
-1
|
0
|
0
|
0
|
0
|
1
|
1
|
2
|
3
|
1
|
|
优化的next[i]
|
-1
|
0
|
0
|
0
|
-1
|
1
|
0
|
0
|
3
|
0
|
KMP算法字符串查找子串的更多相关文章
- KMP 算法 & 字符串查找算法
KMP算法 Knuth–Morris–Pratt algorithm 克努斯-莫里斯-普拉特 算法 algorithm kmp_search: input: an array of character ...
- 【原创】通俗易懂的讲解KMP算法(字符串匹配算法)及代码实现
一.本文简介 本文的目的是简单明了的讲解KMP算法的思想及实现过程. 网上的文章的确有些杂乱,有的过浅,有的太深,希望本文对初学者是非常友好的. 其实KMP算法有一些改良版,这些是在理解KMP核心思想 ...
- KMP算法 - 求最小覆盖子串
KMP与最小覆盖子串 最小覆盖子串:对于某个字符串s,它的最小覆盖子串指的是长度最小的子串p,p满足通过自身的多次连接得到q,最后能够使s成为q的子串. 比如: 对于s="abcab&quo ...
- KMP算法之查找模式串在源串中出现的次数
问题描述: 给定两个字符串T, P.查找字符串P在字符串T中出现的次数. 解决方法: 典型的KMP算法的题目,在此使用的KMP算法为算法导论上介绍的算法.下一篇文章将详细介绍KMP算法的计算过程. 题 ...
- KMP算法(查找子序列)
KMP类似暴力,但是不会和暴力完全一样,回溯到起点. 简单的说 假如 模板链字符串是: abcabcabcabd 寻找abcabd 在模板链出现的次数,并且输出该次数 ...
- HDU-2087 剪花布条 字符串问题 KMP算法 查匹配子串
题目链接:https://cn.vjudge.net/problem/HDU-2087 题意 中文题咯 一块花布条,里面有些图案,另有一块直接可用的小饰条,里面也有一些图案.对于给定的花布条和小饰条, ...
- 串的两种模式匹配方式(BF/KMP算法)
前言 串,又称作字符串,它是由0个或者多个字符所组成的有限序列,串同样可以采用顺序存储和链式存储两种方式进行存储,在主串中查找定位子串问题(模式匹配)是串中最重要的操作之一,而不同的算法实现有着不同的 ...
- Java KMP算法代码
1. KMP 算法(字符串匹配算法)较 BF(朴素的字符串匹配)算法有哪些改进 1) 在主串和子串匹配的过程中,主串不再回退,只改变子串的比较位置. 2) 为子串生成对应的next数组,每次匹配失败, ...
- 回朔法/KMP算法-查找字符串
回朔法:在字符串查找的时候最容易想到的是暴力查找,也就是回朔法.其思路是将要寻找的串的每个字符取出,然后按顺序在源串中查找,如果找到则返回true,否则源串索引向后移动一位,再重复查找,直到找到返回t ...
随机推荐
- Qt 本地化(翻译)
Qt 本地化(翻译) 翻译流程大致是这样的:首先源代码产生 ts 文件,然后送给 Qt Linguist(Qt 语言家)这个 Qt 自带的小工具进行处理产生 qm 翻译文件,最后源代码里加载这个 qm ...
- bos开发日记一
BOS项目 第1天 项目12天安排: 1-2天:项目概述.搭建开发环境.主页设计.持久层和表现层设计 3-6天:项目业务开发(取派员.区域.分区.定区.业务受理)---整个项目分为基础设置.取派.中转 ...
- <进阶版>Markdown指南
有道云笔记内置Markdown编辑器和使用指南. “进阶版”有道云笔记Markdown指南,教你如何进一步掌握待办.清单.流程图和甘特图. 0 待办和清单 待办事项和清单在日常工作.生活中经常被使用. ...
- JDBC 工具类模板c3p0
JDBC 工具类模板 package com.itheima.sh.utils; import com.mchange.v2.c3p0.ComboPooledDataSource; import ja ...
- spark 相关
Spark为什么会比mapreduce快? 1.Spark减少了中间过程的磁盘读写,数据很多时候不需要落地,从而提升了效率. 2.Spark基于内存的读写,减少了磁盘IO.node数据交互的通信时间. ...
- Ubuntu Server 下将HTML页面转换为PNG图片
零.前言 最近做一个网站,需要将网页转换为图片.由于服务器是Ubuntu Server,没有图形界面,所以实现的过程中遇到了很多问题.记录下来备用. 一.安装CutyCapt CutyCapt是一个可 ...
- JS中String对象常用的方法
1. stringObject.charAt(index) 参数:index 必需,即字符在字符串中的下标. 返回值: 返回在指定位置的字符.返回的字符是长度为 1的字符串.(length属性 ...
- Eclipse 常用快捷键 个性设置(Mac)
推荐编程使用Mac 要是非要一个原因 那就是Apple工程师用Mac Google工程师也用Mac 1. 常用快捷键 Mac自带 Command + ← 跳到当前文本行头 Command + → ...
- 【转】cocos2dx3.2学习笔记之Director(导演类)
转载:https://blog.csdn.net/u013435551/article/details/38579747 在Cocos2d-x中,把统筹游戏大局的类抽象为导演类(Director),D ...
- (python)leetcode刷题笔记04 Median of Two Sorted Arrays
4. Median of Two Sorted Arrays There are two sorted arrays nums1 and nums2 of size m and n respectiv ...