字符串和字符串模式匹配
字符串,是一串文字和符号的序列。字符串是由零个或者多个字符的顺序排列所组成的数据结构,其基本元素组成元素是单个字符,字符串的长度可变。
字符串在计算机中的处理非常广泛,人机之间信息的交互,文字信息的处理,生物信息学中基因信息的提取以及Web信息的提取等,都离不开字符串的处理。
C++和C语言都有很多写好的库函数。这里是一个简单的字符串的实现以及一个朴素的字符串匹配算法。
字符串的抽象数据类型表示:
#include<cstring> #include<iostream> using namespace std; #define MaxStrSize 100 //字符串的抽象数据类型表示 class StringPattern { public: StringPattern() { } //构造函数和析构函数 StringPattern(const char *s) { int len=strlen(s); //计算C风格字符串的长度 //新建对象时传入可创建字符串的最大长度 str=new char[MaxStrSize]; //动态分配这个数组 if(str==NULL)cout<<"字符串构造失败"<<endl; nowlen=len; strcpy_s(str,len+1,s); //进行字符串的拷贝,微软的编译器会对strcpy发出警告 } ~StringPattern() { } //计算字符串长度 void OutputStr() { int i=0; while(str[i]!='\0') cout<<str[i++]; } //朴素的字符串匹配算法 int PatternTarget(const char *target,const char *pattern); private: char *str; //字符数组 int nowlen; //当前所在位置 };
朴素的字符串模式匹配算法:
朴素的字符串匹配算法:返回目标串中匹配的位置
1、循环i(目标指针):从0到n-m(目标中最后一次能提取出与模式长度相等的子串位置)执行
从目标中当前开始检测子串位置ch[i]处比较,与模式逐个比较。
2、循环j,模式指针:从0到m-1(模式中最后字符位置)。
3、判断:如果模式当前字符pat.ch[i]不等于目标当前字符T.ch[i+j]
4、本次匹配失败,停止循环j,继续外层循环i,进行下一趟匹配比较。
5、如果当前检测位置对应字符相等:继续循环j,向后比较。
代码:
int StringPattern::PatternTarget(const char *target,const char *pattern) { int n=strlen(target); //计算目标串的长度 int m=strlen(pattern); //计算模式串的长度 int j,i; for(i=0;i<=n-m;i++) { for(j=0;j<m;j++) { if(pattern[j]!=target[i+j]) break; } } if(j==m) return i-1; //返回正确匹配的第一个位置 else { return -1; } }
这样返回的是目标串中和第一个模式串字符匹配的位置。
错误一:缓冲区太小 缓冲区=字符串长度+1
错误二:strcpy和strcpy_s不通过
学习的经验:
1、练习完一个数据结构
2、上网搜该数据结构大全,找出相关链接算法,使这个算法更丰富。
3、和具体应用结合起来。
4、写出优质无错的代码。
字符串相关算法: