字符串和字符串模式匹配

字符串,是一串文字和符号的序列。字符串是由零个或者多个字符的顺序排列所组成的数据结构,其基本元素组成元素是单个字符,字符串的长度可变。

字符串在计算机中的处理非常广泛,人机之间信息的交互,文字信息的处理,生物信息学中基因信息的提取以及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、写出优质无错的代码。

 

字符串相关算法:

 

你可能感兴趣的:(字符串)