其他分享
首页 > 其他分享> > 串

作者:互联网

基本概念

定义

特点

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

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

基本操作

  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