【发布时间】:2012-01-22 16:54:17
【问题描述】:
这个问题与another stackoverflow question密切相关。为那里提出的问题寻找一个非常有效的解决方案。 perl 中实现了后缀数组吗?
这是我目前在 perl 中的解决方案。
chomp(my $ipstr = <>);
my @bigstrchars = split(//, $ipstr);
my $length = (length $ipstr);
my $sum = 0;
my $span = 1;
my $flag = 0;
while ($span < $length) {
for ($j=0; $j+$span<$length; $j++) {
if ($bigstrchars[$j] eq $bigstrchars[$j+$span]) {
$sum++;
}
else {
last;
}
}
if ($span == 1 && $sum == ($length-1)) {
$sum = $length * ($length+1) * 0.5;
$flag = 1;
last;
}
$span++;
}
unless ($flag) {
$sum += $length;
}
如何改进?
编辑
在这里说明问题:
对于两个字符串 A 和 B,我们将字符串的相似度定义为两个字符串共有的最长前缀的长度。例如字符串“abc”和“abd”的相似度为2,而字符串“aaa”和“aaab”的相似度为3。
问题是给出一个算法来计算字符串 S 与其每个后缀的相似性总和。例如,让字符串为:ababaa。那么,字符串的后缀是ababaa、babaa、abaa、baa、aa和a。这些字符串中的每一个与字符串 ababaa 的相似度分别为 6,0,3,0,1,1。因此答案是 6 + 0 + 3 + 0 + 1 + 1 = 11
【问题讨论】: