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’。