串的模式匹配-BF算法
来源:互联网 发布:sqlserver is null 编辑:程序博客网 时间:2024/05/01 21:01
串的模式匹配经常需要用到,判断一个字符串是否是另外一个字符串的一部分。前者称为子串或模式,后者成为主串或正文串。
先用最简单的BF算法实现串的模式匹配。
算法思路:先从主串和子串第一个位置开始进行比较。如果相等,那么继续比较后面的字符,否则从主串失配的下一个元素开始和子串的第一个元素继续匹配。直到比较到主串最后位置,如果一直不匹配,则匹配失败,否则得到匹配的位置。
最好情况时间复杂度:O(n+m)
(假设每次不成功的匹配都发生在子串的第一个字符)
最坏情况时间复杂度:O(n*m)
(假设每次不成功的匹配都发生在子串的最后一个字符)
算法优点:思路简单明了。
算法缺点:时间复杂度高。
#include <iostream>using namespace std;#include<stdio.h>#include<string.h>//字符串采用数组存储.typedef struct{ char ch[100]; int length;}HString;//BF算法int bf(HString *s,HString *t)//如果匹配成功,返回匹配位置。匹配失败,返回0{ int i=1; int j=1; //位置从第一位开始算起 while(i<=s->length&&j<=t->length) { if(s->ch[i]==t->ch[j])//如果匹配成功,都往后找元素继续比较 { i++; j++; } else//匹配失败 { i=i-j+2;//可画图分析得到i需要返回的位置 j=1;//i回到起点 } } if(j>t->length) return i-(t->length); else return 0;}int main(){ HString s,t; int i; int j; scanf("%s",s.ch); //gets(t); scanf("%s",t.ch); s.length=strlen(s.ch); t.length=strlen(t.ch); //将字符串后移一位,从1号位置开始处理 for(i=s.length-1;i>=0;i--) { s.ch[i+1]=s.ch[i]; } for(j=t.length;j>=0;j--) { t.ch[j+1]=t.ch[j]; } if(bf(&s,&t)==0) printf("对不起,你输入的两个字符串不匹配!\n"); else printf("匹配的位置为:%d\n",bf(&s,&t)); return 0;}
CB下调试成功
匹配失败后主串新开始匹配的初始位置(有点丑勉强看看)
总结:BF算法非常简单。我在实现时遇到的困难是字符串的数据结构的选择和操作。对指针的理解还有欠缺,只有多使用才能用好指针吧。KMP算法后续会实现,这个才是常用的。
0 0
- 串的模式匹配--BF算法
- 串的模式匹配之BF算法
- 串的模式匹配-BF算法
- 数据结构- 串的模式匹配算法:BF和 KMP算法
- 串的模式匹配算法:BF和KMP算法
- 串的模式匹配(BF算法,KMP算法)
- 4.3串的模式匹配算法(BF算法)
- 数据结构- 串的模式匹配算法:BF和 KMP算法
- 串的模式匹配算法:BF和 KMP算法
- 模式匹配-BF算法
- 模式匹配算法(BF)
- 串的BF匹配算法
- 串的模式匹配算法之KMP与BF
- 【数据结构基础】串的模式匹配-BF算法
- 串的模式匹配算法(BF、KMP)
- 1.BF 朴素的模式匹配算法
- 字符串的模式匹配: BF算法
- C++ BF模式串匹配算法!
- div 点击切换按钮样式
- JavaSsript获取各种宽高的方法
- pwnable.kr [Toddler's Bottle] -fd
- 关于es6中的import,export, export default
- java中Comparable与Comparator的区别与用法
- 串的模式匹配-BF算法
- Java从键盘接收单个字符并转化为Unicode
- 010-图像移动与对齐
- python爬取学校体育部的跑超数据并用Tkinter写出应用并进行封装生成exe文件
- fatal: unable to access : The requested URL returned error: 403
- [BZOJ3223][Tyvj1729]文艺平衡树
- 四元傅里叶显著性图-四元数-Matlab编程
- Android多线程多进程学习网址
- 图像处理之简化色彩(含OpenCV代码)