字符串,是一串文字和符号的序列。字符串是由零个或者多个字符的顺序排列所组成的数据结构,其基本元素组成元素是单个字符,字符串的长度可变。
字符串在计算机中的处理非常广泛,人机之间信息的交互,文字信息的处理,生物信息学中基因信息的提取以及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、写出优质无错的代码。
字符串相关算法: