ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

2021-12-26 13:03:05  阅读:153  来源: 互联网

标签: 子串 字符 后缀 next 主串 空串


基本概念

定义

  • 字符串(String):由多个或零个字符组成的有限序列。
  • 串名:S
  • 串值:""里面的字符序列。
  • 串的长度:串中的字符个数n。n=0时为空串
  • 子串:串中任意个连续的字符组成的子序列
  • 主串:包含子串的串。
  • 字符在主串中的位置子串在主串中的位置、空格串、空串。

特点

是一种特殊的线性表,数据元素之间呈线性关系。

数据对象:字符集。以字符串作为操作对象。

基本操作

  1. StrAssign(&T,chars)赋值
  2. StrCopy(&T,S)复制,s->t
  3. StrEmpty(S):判空。
  4. StrLength(S):求串长。
  5. ClearString(&S):清空,空串。
  6. DestroyString(&S):销毁串,回收存储空间。
  7. Concat(&T,S1,S2):串联接,T=S1+S2.

存储结构

顺序存储
1. 分配连续的存储空间,每个char字符占1B。
链式存储
  1. 存储密度低,每个字符1B,每个指针4B。

数据运算

//求子串
bool SubString(SString &Sub,SString S,int pos,int len){
    //子串范围越界
    if(pos+len-1 >S.length)
        return false;
    for(int i=pos;i<pos+len;i++)
        sub.ch[i-pos+1] = S.ch[i];
    Sub.length = len;
    return true;
}
//比较串的大小
//若S>T,则返回值>0;若S=T,则返回值=0;若S>T,则返回值<0
int StrCompare(SString S,SString T){
    for(int i=1;i<=S.length && i<=T.length; i++){
        if(S.ch[i]!=T.ch[i])
            return S.ch[i]-T.ch[i];
    }
    //扫描过的所有字符都相同,则长度长的串更大
    return S.length -T.length;
}
//定位操作
//若主串S中存在与串T值相同的子串,则返回它在主串S中第一次出现的位置;否则函数值为0.
int Index(SString S,SString T){
    int i=1,n=StrLength(S),m=StrLength(r);
    //暂存子串
    SString sub;
    while(i<=n-m+1){
        SubString(sub,S,i,m);
        if(StrCompare(sub,T)!=0) ++i;
        //返回子串在主串中的位置
        else return i;
    }
    //S中不存在与T相等的子串
    return 0;
}

模式匹配

KMP

next数组

具体实现next数组时有的是将前缀表完整右移然后令第一个为-1(在f冲突时直接找f对应的下标);有的是整体-1(冲突时还是看前一位,只不过会加回来);有的原封不动(冲突时看f的前一位)

void getNext(next,S){
	// 初始化
    //j前缀末尾、i之前且包括i的子串的最长相等前后缀的长度。
    //如'aabaaf',i->f,j='aabaa'的最长相等前后缀长度=2
    j=0;
    //子串只有一个字符时,相同前后缀的最大长度是0
    next[0]=0;
    //i后缀末尾,
    //最短子串没有前后缀,只能从子串aa中初始化i=1
    for(i=1;i<s.size;i++){
       //前后缀不相同
        //连续回退,不能用if,只能用while
        //前缀要进行回退,直到回退到相等或者到模式串开头位置,回退的下标就是当前前缀前一个位置的next数组的值
        while(j>0&&s[i]!=s[j]){
            //遇见冲突则回退,同kmp回退是一个道理
            //动态规划思想
             j=next[j-1];
        }
       //前后缀相同 
        if(s[i]==s[j])
            j++;
        //next数组的含义:在失配时,应该从位置j=i回退到之前匹配时候的位置。而在此点恰好匹配,所以计入next[i]
        next[i]=j;        
    }
    
}

标签:,子串,字符,后缀,next,主串,空串
来源: https://www.cnblogs.com/wangqr907/p/15732699.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有