数据结构常见问题(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’。

你可能感兴趣的:(数据结构与算法)