前言

很多人把KMP和暴力破解分开,其实KMP就是暴力破解,整个高大上的名字,难道还不是去试错匹配吗?

KMP是这样子的,比如说:

绿色部分是我要匹配的。

按照一般写法是这样子的:

ABABA 去匹配 ABABC 发现匹配不了,然后后移一位用BABACDEFG 去匹配 ABABC。

KMP在此做了优化,本来后移一位的,这时候KMP后移两位再去匹配。

那么这个两位是怎么来的呢?

下面是规律:

正文

普通暴力破解:

static void Main(string[] args)
{
string str1 = "不玩德玛西亚之力这可真的不是太好!";
string str2 = "太好";
int index=violenceMatch(str1,str2);
Console.WriteLine(index);
Console.Read();
}
public static int violenceMatch(String str1, String str2)
{
int i = 0;
int j = 0;
while (i<str1.Length&&j<str2.Length)
{
if (str1[i] == str2[j])
{
i++;
j++;
}
else
{
i = i - (j - 1);
j = 0;
}
}
if (j == str2.Length)
{
return i - j;
}
return -1;
}

kmp 暴力破解:

static void Main(string[] args)
{
String str1 = "BBC ABCDAB ABCDABCDABDE";
String str2 = "ABCDABD";
int[] next = kmpNext("ABCDABD");
int index= kmpSearch(str1,str2,next);
Console.WriteLine(index);//15
Console.Read();
} public static int kmpSearch(string str1, string str2, int[] next)
{
for (int i = 0, j = 0; i < str1.Length; i++)
{
while (j > 0 && str1[i] != str2[j])
{
j = next[j - 1];
}
if (str1[i] == str2[j])
{
j++;
}
if (j == str2.Length)
{
return i - j+1;
}
}
return -1;
} public static int[] kmpNext(string dest)
{
int[] next = new int[dest.Length];
//如果只有一个那么没有前缀和后缀
next[0] = 0;
for (int i = 1,j=0; i < dest.Length; i++)
{
while (j>0&& dest[i] != dest[j])
{
j = next[j - 1];
}
if (dest[i] == dest[j])
{
j++;
}
next[i] = j;
}
return next;
}

重新整理数据结构与算法(c#)——KMP破解[二十七]的更多相关文章

  1. 数据结构与算法之KMP 字符串匹配

    举例来说,有一个字符串"DSFFKFJD KFJLKFDLJFJ IWWJKJFJIA",我想知道,里面是否包含另一个字符串"JFJI",有的话就返回在原字符串 ...

  2. 数据结构与算法5—KMP算法

    串的模式匹配算法 子串(模式串)的定位操作通常称为串的模式匹配. 这是串的一种重要操作,很多 软件,若有“编辑”菜单项的话, 则其中必有“查找”子菜单项. 串的顺序存储实现 #include<s ...

  3. 重新整理数据结构与算法(c#)—— 图的深度遍历和广度遍历[十一]

    参考网址:https://www.cnblogs.com/aoximin/p/13162635.html 前言 简介图: 在数据的逻辑结构D=(KR)中,如果K中结点对于关系R的前趋和后继的个数不加限 ...

  4. 数据结构和算法之单向链表二:获取倒数第K个节点

    我们在做算法的时候或多或少都会遇到这样的问题,那就是我们需要获取某一个数据集的倒数或者正数第几个数据.那么今天我们来看一下这个问题,怎么去获取倒数第K个节点.我们拿到这个问题的时候自然而然会想到我们让 ...

  5. javascript数据结构和算法 第二章 (数组) 二

    字符串表示的数组 join() 和 toString() 函数返回数组的字符串表示.这两个函数通过将数组中的元素用逗号分隔符切割,返回字符串数组表示. 这里有个样例: var names = [&qu ...

  6. C#数据结构与算法系列(十二):递归(Recursion)

    1.介绍 简单的说:递归就是方法自己调用自己,每次调用时传入不同的变量,递归有助于编程者解决复杂的问题,同时也让代码变得整洁 2.规则 执行一个方法时,就创建一个新的受保护的独立空间(栈空间) 方法的 ...

  7. [PTA] 数据结构与算法题目集 6-12 二叉搜索树的操作集

    唯一比较需要思考的删除操作: 被删除节点有三种情况: 1.叶节点,直接删除 2.只有一个子节点,将子节点替换为该节点,删除该节点. 3.有两个子节点,从右分支中找到最小节点,将其值赋给被删除节点的位置 ...

  8. 数据结构与算法--KMP算法查找子字符串

    数据结构与算法--KMP算法查找子字符串 部分内容和图片来自这三篇文章: 这篇文章.这篇文章.还有这篇他们写得非常棒.结合他们的解释和自己的理解,完成了本文. 上一节介绍了暴力法查找子字符串,同时也发 ...

  9. hdu 3336:Count the string(数据结构,串,KMP算法)

    Count the string Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  10. 数据结构之BF算法,kmp算法,三元组,十字链表总结

    在这一章中,老师教了我们四种数据结构:BF算法,kmp算法,三元组和十字链表:还给我们讲了2019年团体天体赛中T1-8的AI题 1.对于BF和kmp算法,老师除了在课堂上讲解算法的主要核心思想外,还 ...

随机推荐

  1. Java 程序员第一次运行 Python 项目,使用 python-pptx 提取 ppt 中的文字和图片

    人工智能时代,最需要学习的编程语言是:python .笔者是个 python 小白,昨天花了两个小时,第一次成功运行起来 python 项目 . 项目是 powerpoint-extractor ,可 ...

  2. 移远4G数传模块EC800M开发总结之基本备忘

    一 前记 1 EC800M模块是移远推出的小尺寸低功耗针对可穿戴市场的数传产品.笔者在几个产品上使用过程中,遇到了一些问题. 这里做个备忘吧. 二 梳理 1 工具,这个串口的默认波特率为115200. ...

  3. python的替换函数strip(),replace()和re.sub()实例分析

    前记: python是一个非常好用的语言,能够帮忙处理很多日常的耗费体力的事情.今天做一个脚本的时候,遇到了python替换的问题,这里就梳理一下知识点吧. 概念: 1.replace() 基本用法: ...

  4. 14_编译FFmpeg

    本文来详细讲解一下:如何在Mac.Windows环境下成功编译FFmpeg. 目标 这里先提前说明一下,最后希望达到的效果: 编译出ffmpeg.ffprobe.ffplay三个命令行工具 只产生动态 ...

  5. 【虚拟仿真】3DCAT虚拟仿真在化工安全方面的应用

    随着中国经济的快速发展,石油化工企业的生产事故也在频繁发生.国家目前对生产安全的重视程度提高到前所未有的高度.企业也在安全管理上做了许多工作,如:进行安全培训,制定安全手册等.但这些方式的效果不明显, ...

  6. 记录--前端无感知刷新token & 超时自动退出

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 前端无感知刷新token&超时自动退出 一.token的作用 因为http请求是无状态的,是一次性的,请求之间没有任何关系,服务端 ...

  7. 记录--Vue使用CDN引入,响应式失效?

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 背景 最近心血来潮,想要在本地开发时,也用CDN的方式引入 Vue,想着既然通过CDN引入了,那么在项目中就没必要再 import Vue ...

  8. elasticsearch中runtime_mapping实战

    背景:需要根据一个实时计算处理的结果值进行排序,数据从es中查询.(基于业务背景:佣金排序) es版本:7.17.1:spring-data-elasticsearch版本:4.3.9 方式一:mys ...

  9. js中订阅发布模式bus

    export default { list: {}, // 事件中心集中地 /** * 发布订阅 * @param {string} name 事件名 * @param [...args] */ $e ...

  10. SHELL使用教程

    疑难解答 执行完shell文件后不退出 在shell文件末尾添加如下命令即可. exec /bin/bash 参考资料 为什么sh脚本运行之后自动退出,有没有让终端不自动关闭的方法. - Ubuntu ...