0
点赞
收藏
分享

微信扫一扫

字符串的模式匹配

whiteMu 2022-06-28 阅读 95

前言:记得大二学习字符串匹配也只是把书上的伪代码看懂,原理搞明白,也就没有亲自去实现代码,而且自己也不是搞算法的,所以偶尔做题也很少遇到字符串匹配题,上次考试很尴尬遇到了这种题,虽然知道考的啥,但是写不出代码,很是尴尬,所以今天就花点时间把知识回顾一下,并把代码实现。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

1:模式匹配

模式匹配(Pattern Matching) 即子串定位运算(Index函数)。

算法目的:确定主串中所含子串第一次出现的位置(定位) ——即如何实现 Index(S,T,pos)函;

初始条件:串S和T存在,T是非空串,1≤pos≤StrLength(s) 操作结果:

若主串S中存在和串T值相同的子串,则返回它在主串S中第pos个字符之后第一次出现的位置;否则函数值为0。

注:S称为被匹配的串,T称为模式串。若S包含串T,则称“匹配成功”。否则称 “匹配不成功” 。

常见的两种算法:

BF算法 (又称古典或经典的、朴素的、穷举的)

KMP算法(特点:速度快)

2:BF算法

① BF算法设计思想: 将主串的第pos个字符和模式的第1个字符比较, 若相等,继续逐个比较后续字符;

若不等,从主串的下一字符(pos+1)起,重新与第一个 字符比较。

直到主串的一个连续子串字符序列与模式相等 。返回值为S中与T匹配的子序列第一个字符的序号,即匹配成功。 否则,匹配失败,返回值 0 .

字符串的模式匹配_#include

BF算法的伪代码:

字符串的模式匹配_#include_02

算法C++实现

1 #include<bits/stdc++.h>
2
3 using namespace std;
4 int BF(string a,int stra,string b,int strb)
5 {
6 int i=0;
7 int j=0;
8 while(i<stra && j<strb)
9 {
10 if(a[i]==b[j])
11 {
12 i++;
13 j++;
14 }
15 else
16 {
17 i=i-j+1;
18 j=0;
19 }
20 }
21 if(j>=strb){
22 cout << "匹配成功";
23 return i-strb;
24 } else
25 {
26 cout << "匹配失败";
27 return 0;
28 }
29 }
30 int main()
31 {
32 string a,b;
33 cin >> a >> b;
34 int stra=a.length();
35 int strb=b.length();
36 BF(a,stra,b,strb);
37 return 0;
38 }

字符串的模式匹配_子串_03

 

3:KMP算法

字符串的模式匹配_i++_04

 字符串的模式匹配_#include_05

字符串的模式匹配_i++_06

字符串的模式匹配_#include_07

字符串的模式匹配_#include_08

 

字符串的模式匹配_i++_09

 字符串的模式匹配_#include_10

字符串的模式匹配_#include_11

算法C++实现

1 #include<bits/stdc++.h>
2
3 using namespace std;
4 int next[1000];
5 void get_next(string str,int stra)
6 {
7 int i=1;
8 next[1]=0;
9 int j=0;
10 while(i<stra)
11 {
12 if(j==0 || str[i]==str[j])
13 {
14 ++i;
15 ++j;
16 next[i]=j;
17 }else
18 {
19 j=next[j];
20 }
21 }
22 }
23
24 int KMP(string a,int stra,string b,int strb)
25 {
26 int j=1;
27 int i=0;
28 while(i<stra && j<=strb)
29 {
30 if(j==0 || a[i]==b[j-1] ){
31 i++;
32 j++;
33 }
34 else
35 {
36 j=next[j];
37 }
38 }
39 if(j>strb) {
40 cout << "匹配成功" << endl;
41 return i-strb;
42 }else
43 {
44 cout << "匹配失败" << endl;
45 return -1;
46 }
47 }
48 int main()
49 {
50 memset(next,0,sizeof(next));
51 string a,b;
52 cin >> a >> b;
53 int stra=a.length();
54 int strb=b.length();
55 get_next(b,strb);
56 int m=KMP(a,stra,b,strb);
57 if(m!=-1)
58 {
59 cout << "匹配的位置在" << m << endl;
60 }
61 return 0;
62 }

 

 

作者:你的雷哥

本文版权归作者所有,欢迎转载,但未经作者同意必须在文章页面给出原文连接,否则保留追究法律责任的权利。

举报

相关推荐

0 条评论