在这一章中,老师教了我们四种数据结构:BF算法,kmp算法,三元组和十字链表;还给我们讲了2019年团体天体赛中T1-8的AI题

1、对于BF和kmp算法,老师除了在课堂上讲解算法的主要核心思想外,还给了我们一道作业题去巩固;

这道题如下:

7-1 串的模式匹配 (30 分)
 

给定一个主串S(长度<=10^6)和一个模式T(长度<=10^5),要求在主串S中找出与模式T相匹配的子串,返回相匹配的子串中的第一个字符在主串S中出现的位置。

输入格式:

输入有两行: 第一行是主串S; 第二行是模式T.

输出格式:

输出相匹配的子串中的第一个字符在主串S中出现的位置。若匹配失败,输出0.

输入样例:

在这里给出一组输入。例如:

  1. aaaaaba
  2. ba

输出样例:

在这里给出相应的输出。例如:

  1. 6

  2. 首先,可以用BF算法去实现,但是BF算法是不能通过所有测试点的;BF算法实际上是一种暴力算法,而题目给的测试样例会有一个卡住而造成超时;
    比如主串为aaaaaaaaaaaaaaaab 模式串为aaaaab ,这样的话每次都得去比较到最后一个才发现不匹配,而题目给的最大数据是1000000,所以一定是超时的;
  3. BF算法代码如下:
    我这里写的跟课本不太一样,我的ij下标是从0开始,而课本的ij表示的是位置,从1开始,所以当不匹配是课本回溯到的是i-j+2;而我这里是i-j+1
  1. #include<iostream>
  2. #include<string.h>
  3. using namespace std;
  4.  
  5. string s , t;
  6. int ssize ,tsize;
  7. int i = ;
  8. int j = ;
  9. int main()
  10. {
  11. cin>>s; //输入主串
  12. cin>>t; //输入模式串
  13. ssize = s.size(); //主串的长度;
  14. tsize = t.size(); //模式串的长度;
  15. while(i<ssize&&j<tsize)
  16. {
  17. if(s[i]==t[j]) //如果匹配,则i++,j++;主串和模式串都向前移一位;
  18. {
  19. i++;
  20. j++;
  21. }else
  22. {
  23. i = i-j+; 否则主串回溯到i-j+1
  24. j = ; 模式串回溯到0
  25. }
  26. }
  27. if(j>=tsize)
  28. {
  29. cout<<i-tsize+;
  30. }else
  31. cout<<;
  32. return ;
  33. }

这道题还能用kmp算法去写,kmp的核心是next数值;

  1. 解题思路:串的模式匹配有两种:一种是BF算法,一种是KMP算法
    基于这道题给的数据,若用BF算法便会超时,所以我们这道题用KMP算法;
    那么问题来了,KMP算法到底怎么用的;简单来讲,就是有两个步骤:
    1、求模式串的next数组;
    2、进行主串与模式串的匹配;
    假设主串和模式串分别为
  1. 第一个问题:如何求next数组
  2. 数据结构之BF算法,kmp算法,三元组,十字链表总结的更多相关文章

      1. 数据结构- 串的模式匹配算法:BF KMP算法
      1.   数据结构- 串的模式匹配算法:BF KMP算法  Brute-Force算法的思想 1BF(Brute-Force)算法 Brute-Force算法的基本思想是: 1) 从目标串s 的第一个字 ...

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

      1. hdu 3336:Count the string(数据结构,串,KMP算法)
      1. Count the string Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

      1. 算法 kmp算法
      1. kmp算法是改进后的字符匹配算法,它与bf算法的区别是,每次从串与主串匹配失败后,从串与主串匹配的位置不同. 下面具体说下这两种算法的区别: 主串:BABCDABABCDABCED 从串:ABCDAB ...

      1. 经典算法 KMP算法详解
      1. 内容: 1.问题引入 2.暴力求解方法 3.优化方法 4.KMP算法 1.问题引入 原始问题: 对于一个字符串 str (长度为N)和另一个字符串 match (长度为M),如果 match st ...

      1. 笔记-算法-KMP算法
      1. 笔记-算法-KMP算法 1.      KMP算法 KMP算法是一种改进的字符串匹配算法,KMP算法的关键是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的.具体实现就是实现一 ...

      1. 值得花费一周研究的算法 -- KMP算法(indexOf)
      1. KMP算法是由三个科学家(kmp分别是他们名字的首字母)创造出来的一种字符串匹配算法. 所解决的问题: 求文本字符串text内寻找第一次出现字符串s的下标,若未出现返回-1. 例如 text : &q ...

      1. 字符串模式匹配算法1 - BFKMP算法
      1. 在字符串S中定位/查找某个子字符串P的操作,通常称为字符串的模式匹配,其中P称为模式串.模式匹配有多种算法,这里先总结一下BF算法和KMP算法. 注意:本文在讨论字符位置/指针/下标时,全部使用C语法 ...

      1. BFkmp算法
      1. 第七周 字符串匹配 BF算法,kmp算法 BF:时间复杂度为 O(m*n) int Index_BF(SString S, SString T, int pos) { ; while (i <= ...

      1. BF算法 + KMP算法
      1. 准备: 字符串比大小:比的就是字符串里每个字符的ASCII码的大小.(其实这样的比较没有多大的意义,我们关心的是字符串是否相等,即匹配等) 字符串的存储结构:同线性表(顺序存储+链式存储) 顺序存储结 ...

    1.  
    2. 随机推荐

        1. DEV CheckComboboxEditCheckedListBoxControl(转)
        1. CheckComboboxEdit //先清空所有,若在窗体Load事件中,也可以不清空 //cbRWYs.Properties.Items.Clear(); var RwyList = tspro. ...

        1. Python函数的初识
        1.    什么是函数 定义: 定义一个事情或者功能,等到需要用的时候直接用就可以了,那么这个定义的就是一个函数 函数  :  对代码块和功能的封装和定义 函数定义的格式:     def   函数名() ...

        1. 分析比较多表查询中的INJOIN
        1. IN 是子查询的关键字,JOIN 是连接的关键字,项目开发中经常会使用到多表查询,而子查询与连接正是实现多表查询的重要途径.那两者是怎么运行的?INJOIN哪个更好?下面就来分析与比较. 现在有te ...

        1. IE10等支持classList2.0
        1. chrome24+, firesfox26+起支持classList2.0,即让它同时添加或删除多个类名, toggle方法支持第2个参数,用于强制添加或删除 var div = document.c ...

        1. Vue基础以及指令, Vue组件
        1. Vue基础篇一 Vue指令 Vue的指令directive很像我们所说的自定义属性,指令时Vue模板中最常用的功能,它带有v-前缀,功能是当表达式改变的时候,相应的行为作用在DOM上. <div ...

        1. Stream01 定义、迭代、操作、惰性求值、创建流、并行流、收集器、stream运行机制
        1. 1 Stream Stream Java 8 提供的一系列对可迭代元素处理的优化方案,使用 Stream 可以大大减少代码量,提高代码的可读性并且使代码更易并行. 2 迭代 2.1 需求 随机创建 ...

        1. Tensorflow学习(练习)—下载骨骼图像识别网络inception数据集
        1. import tensorflow as tfimport osimport tarfileimport requests #inception模型下载地址inception_pretrain_mod ...

        1. 696. Count Binary Substrings统计配对的01个数
        1. [抄题]: Give a string s, count the number of non-empty (contiguous) substrings that have the same numb ...

        1. TOP命令 详解CPU 查看多个核心的利用率按1
        1. top命令是linux下常用的工具,可以查看各个进程的CPU使用情况.先看一个实例: 这是Ramnode双核VPStop显示结果: 左上角可以看到CPU的使用率是11.3%,但是看下面的进程,plu ...

        1. 面试题:JavaIO流分类详解与常用流用法实例
        1. Java流概念: Java把所有的有序数据都抽象成流模型,简化了输入输出,理解了流模型就理解了Java IO.可以把流想象成水流,里面的水滴有序的朝某一方向流动.水滴就是数据,且代表着最小的数据流动单 ...