如何找到内存使用量较少的最长公共子串?

时间:2013-12-30 10:33:21

标签: algorithm

我需要找到最长的公共子串,其中(子串长度*计数)

例如,当我有字符串:

hi, hello world ... hello world ... hi, hello world

答案是hello world,因为(11 * 3)> (15 * 2)

我在这个question中找到了相关的讨论,但由于内存使用率很高,因此在我的情况下使用是不切实际的。

有没有更好的方法可以做到这一点?

1 个答案:

答案 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];