yewanting

在这一章中,老师教了我们四种数据结构: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.

输入样例:

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

aaaaaba
ba

输出样例:

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

6

首先,可以用BF算法去实现,但是BF算法是不能通过所有测试点的;BF算法实际上是一种暴力算法,而题目给的测试样例会有一个卡住而造成超时;
比如主串为aaaaaaaaaaaaaaaab 模式串为aaaaab ,这样的话每次都得去比较到最后一个才发现不匹配,而题目给的最大数据是1000000,所以一定是超时的;

BF算法代码如下:
我这里写的跟课本不太一样,我的i,j下标是从0开始,而课本的i,j表示的是位置,从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 = 0 ;
 8 int j = 0 ;
 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+1;    否则主串回溯到i-j+1;
24             j = 0;           模式串回溯到0;
25         }
26     }
27     if(j>=tsize)
28     {
29         cout<<i-tsize+1;
30     }else
31     cout<<0;
32     return 0;
33 }

 

 

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

解题思路:串的模式匹配有两种:一种是BF算法,一种是KMP算法
基于这道题给的数据,若用BF算法便会超时,所以我们这道题用KMP算法;
那么问题来了,KMP算法到底怎么用的;简单来讲,就是有两个步骤:
1、求模式串的next数组;
2、进行主串与模式串的匹配;
假设主串和模式串分别为

 

第一个问题:如何求next数组

分类:

技术点:

相关文章:

  • 2021-08-31
  • 2021-08-31
  • 2018-09-21
  • 2021-11-07
  • 2019-09-26
  • 2021-12-19
  • 2021-08-31
  • 2021-11-07
猜你喜欢
  • 2021-08-31
  • 2021-08-31
  • 2021-08-29
  • 2019-10-31
  • 2018-03-28
  • 2018-07-05
  • 2021-08-31
相关资源
相似解决方案