字符串和字符串模式匹配

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

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

 

字符串相关算法:

 

posted @ 2013-04-27 09:52  李VS超  阅读(594)  评论(0编辑  收藏  举报