数据结构_串

串的基本操作:
串的插入:
StrInstert(S,pos,T)
初始条件:串S和串T存在,0<pos<StrLength(S)。
操作结果:在串S下表为pos的字符前一个位置插入串T。
例如: S=“chater” ;T=“rac” ;执行StrInstert(S,4,T);后结果为:S=“character”;
串的删除:
StrDelete(S,pos,len);
初始条件:串S存在,1<=pos<=StrLength(S)+1。
操作结果:从串S中删除pos位置起,长度为len的子串。
例如: S=“character”;执行StrDelete(S,4,3);后结果为:
S=“chater”;
串的连接:
StrCat(S,T);
初始条件:串S和串T存在。
操作结果:返回一个由S和T连接而成的新串。
例如: StrCat(“man”,“kind”)=“mankind”;
求子串:
SubString(Sub,S,pos,len)
初始条件:串S存在,1<=pos<=Length(s)且1<=len<=Length(S)-pos+1;
操作结果:用Sub返回S串中pos位置开始长度为len的子串。
例如:SubString(sub1,“commander”,4,3);执行后sub1=“man”.
索引:
StrIndex(S,pos,T)
初始条件:串S和串T存在,T是非空串
操作结果:若主串S中存在和T相同的子串,则返回它在主串S中第pos个字符开始第一次出现的位置,否则函数值为0 。
例如:S=“abccdacb”; T=“bcc”;执行StrIndex(S,1,T)=2
替换:
StrReplace(S,T,V)
初始条件:串S、T、V均存在,且T为非空串。
操作结果:用V替换主串S中出现的所有的与T相等的不重叠的子串。
例:S=“abcaabcaaabca”;T=“bca”;V=“x”;
S=“axaxaax”;
串的存储结构:(1)定长顺序穿(2)堆串(3)块链串
串的模式匹配:
(1)简单匹配算法
主串S中的子串与模式串T进行比较,直到找到相同的子串为止。如果存在相同的子串,则匹配成功,返回子串在主串S中的位置pos。否则,匹配不成功。
比较策略:从前到后依次进行比较。
时间复杂度:O(m*n)。

int Index(SString S,int pos,SString T){
	int i=pos,j=1;
	while(i<S.len&&j<T.len){
		if(S.ch[i]==T.ch[j]){
			++i;
			++j;
		}
		else{
			i=i-j+2;
			j=1;
		}
	}
	if(j>T.len)
		return i-T.len;
	else
		return 0;
}

(2)KMP算法
特点:不需要回溯主串S的i指针。且时间复杂度可以达到O(m+n)。
思想:从主串的第pos个位置开始与模式串的第一个字符进行比较。
相等:继续比较后续字符:i++;j++;
j==0:主串位置后移,和模式串首个字符开始比较;i++;j++;
不相等:主串位置不变,和模式串的第next[j]位置比较,j=next[j]。

int Index_KMP(SString S,int pos,SString T){
	int i=pos,j=1;
	while(i<S.len&&j<T.len){
		if(j==0||S.ch[i]==T.ch[i]){
			i++;
			j++;
		}
		else
			j=next[j];
	}
	if(j>T.len)
		return i=T.len;
	else
		return 0;
}

next[j]的求法:
在这里插入图片描述
在这里插入图片描述

void Get_Next(SString S,int next[]){
	int j=1,k=0;
	next[1]=0;
	while(j<T.len){
		if(k==0||T.ch[j]==T.ch[k]){
			j++;
			k++;
			next[j]=k;
		}
		else
			k=next[k];
	}
}

nextval求法:
在这里插入图片描述

在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值