我需要找到最长的公共子串,其中(子串长度*计数)。
例如,当我有字符串:
hi, hello world ... hello world ... hi, hello world
答案是hello world
,因为(11 * 3)> (15 * 2)。
我在这个question中找到了相关的讨论,但由于内存使用率很高,因此在我的情况下使用是不切实际的。
有没有更好的方法可以做到这一点?
答案 0 :(得分:1)
这是perl的解决方案。可能它不是内存效率,但它适用于显示的测试字符串
use warnings;
use strict;
my $s="hi, hello world ... hello world ... hi, hello world";
my %h=();
#find the repeated strings, all of them
for (0..length($s) ) {
my $x=substr($s,$_);
for my $m ($x=~/(.*).*\1/) { $h{$m}++} ; }
#find the count of each strings repeats
for my $f (keys %h) { $h{$f} = () = $s=~/\Q$f/g; }
#sort the length*count to find the best
my @ord=sort { length($b)*$h{$b} <=> length($a)*$h{$a} } keys %h;
#this one is the best
print $ord[0];