前言

很多人把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. spring源码手写aop

    AOP:       aop切面编程,其实就是spring增强器的一个扩展,就是通过beanPostProcessor的after后置方式实现的,其中在after中把需要的bean通过放射+动态代理完 ...

  2. Codeforces Round 926 (Div. 2)(A~D)

    目录 A B C D A 输出最大值减最小值,或者排序算一下答案 #include <bits/stdc++.h> #define int long long #define rep(i, ...

  3. 在Visual Studio 中使用git系列文章目录

    在Visual Studio 中使用git--什么是Git(一) 在Visual Studio 中使用git--给Visual Studio安装 git插件(二) 在Visual Studio 中使用 ...

  4. TI工程师总结的判断ADS129x是否工作正常的方法步骤

    当大多数 ADC 出现无响应时,可以通过一些基本的调试技术帮助验证器件是否仍然正常工作.以下是 ADS129x 器件出现无响应时需要采取的一些基本步骤: 为器件通电.然后探测器件电源引脚或最近的去耦电 ...

  5. python中bytes转int的实例(bytearray to short int in python)

    python很多数据都是bytes格式的,经常需要转换成int或者short,笔者实际项目有需求,这里就做个笔记吧. 实例一: bytes转short:(无符号类型) import struct ba ...

  6. AES算法:加密通信的新选择

    AES算法起源: AES(Advanced Encryption Standard)算法是一种对称密钥加密算法,由比利时密码学家Joan Daemen和Vincent Rijmen设计,于2001年被 ...

  7. 浅析倾斜摄影三维模型(3D)几何坐标精度偏差的几个因素

    浅析倾斜摄影三维模型(3D)几何坐标精度偏差的几个因素 倾斜摄影是一种通过倾斜角度较大的相机拍摄建筑物.地形等场景,从而生成高精度的三维模型的技术.然而,在进行倾斜摄影操作时,由于多种因素的影响,导致 ...

  8. 探讨三维模型OBJ格式轻量化在三维展示效果上的重要性

    探讨三维模型OBJ格式轻量化在三维展示效果上的重要性 三维模型的OBJ格式轻量化在三维展示效果方面具有重要性.以下是对三维模型OBJ格式轻量化在三维展示效果上的重要性进行分析: 1.提高渲染性能:原始 ...

  9. [MySQL]细节、经验

    [版权声明]未经博主同意,谢绝转载!(请尊重原创,博主保留追究权) https://blog.csdn.net/m0_69908381/article/details/129922615 出自[进步* ...

  10. 在Centos7上安装Redis6

    一.背景 Redis是一个非常流行的NOSQL数据库,拥有的数据类型非常丰富,此处我们简单记录一下在Centos7上是如何安装Redis6的.Redis的安装是推荐使用源码进行安装的. 二.安装步骤 ...