串
作者:互联网
串
基本概念
定义
- 字符串(String):由多个或零个字符组成的有限序列。
- 串名:S
- 串值:""里面的字符序列。
- 串的长度:串中的字符个数n。n=0时为空串。
- 子串:串中任意个连续的字符组成的子序列
- 主串:包含子串的串。
- 字符在主串中的位置、子串在主串中的位置、空格串、空串。
特点
是一种特殊的线性表,数据元素之间呈线性关系。
数据对象:字符集。以字符串作为操作对象。
基本操作
- StrAssign(&T,chars)赋值
- StrCopy(&T,S)复制,s->t
- StrEmpty(S):判空。
- StrLength(S):求串长。
- ClearString(&S):清空,空串。
- DestroyString(&S):销毁串,回收存储空间。
- Concat(&T,S1,S2):串联接,T=S1+S2.
存储结构
顺序存储
1. 分配连续的存储空间,每个char字符占1B。
链式存储
- 存储密度低,每个字符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