• 字符串和字符串模式匹配


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

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

    字符串相关算法:

  • 相关阅读:
    java多线程--线程和线程池
    java多线程--锁学习
    vue项目中使用iconfont
    组件封装-无数据组件
    添加自定义字体
    时间格式化(自定义格式)
    深度克隆方法
    LazyMan面试题
    lodash.throttle实现节流
    第6章:关系数据库理论(考研重点)
  • 原文地址:https://www.cnblogs.com/fistao/p/3046375.html
Copyright © 2020-2023  润新知