数据结构常见问题(3)串

1.从串S中删除所有和串T相同的字串。

分析:

此操作等同于“以空串置换所有和串T相同的字串”。

算法的目标是构造如上图的一个新串。

步骤:

如图从K开始截取,pos为搜索串的起始位置

算法的基本操作:

news = Concat(news, SubString(S, pos, k - pos));

下一次搜索串的起始位置为

pos = k + StrLength(T);

初始化:

n = StrLength(S); m = StrLength(T);

k = pos = 1; StrAssign(news, '');//赋值新串

while(k <= n - m + 1){

sub = SubString(S, k, m);

if(StrCompare(sub, T) != 0) k++;

else{

news = Concat(news, SubString(S, pos, k-pos));

pos += k; k = pos;

}

}

news = Concat(news, SubString(S, pos, n - pos + 1));//将尾部连接到新串。


2.求串S中出现的第一个最长重复字串及其位置。

分析:

所谓的“重复字串”指的是:

SubString(S, i, len) == SubString(S, j, len);

1 <= i < j <=  StrLength(S)

1 <= len <= StrLength(S) - j + 1

例如:S='aaaaaaa'的最长重复字串为

T = ‘aaaaaa’;


具体解法:

利用求next函数的算法

next[j] != 0;表明在第j个字符之前存在一个长度为next[j] - 1的重复字串。

所以算法的基本思想为:

求串 pat = SubString(S, i, StrLength(S) - i + 1)的next函数值, i =1,2,...,StrLength(S)-1并从中求最大值。


所以最大重复字串的长度为6,为‘aabaaa’。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值