2014-11-13 68 views
-1

也许有一个函数,它可以找到perl中每个(按字符长度最大)等于string1和string2的子字符串,不是吗?Perl:找到两个字符串的所有匹配的子字符串

我可以找到字符串中的每个子字符串,使用m/substring/g;

为了搜索所有相等的子字符串,我必须移动string1的begin和symbol-by-simbol比较字符串的指针。我怎样才能在Perl中做到这一点,或者有没有一种方法可以解决? (就绪功能)

预先感谢您。

my $string1 = "... (i==i)kn;i=n.n;k(i(i,"%i",&i);i ..."; my $string2 = "... k;kn;i=n.n;k;k(i(i,"%i",&i);k ..."; my @answer = (..., "kn;i=n.n;", "k(i(i,"%i",&i);", ...);

+0

听起来像一个家庭作业... –

+0

剽窃系统C源代码检查 - 检查homeworks,我的第一个Perl程序))) –

+1

显示示例输入和输出?我不太明白你要求什么。 – ysth

回答

1

你举的例子似乎表明返回字符串的两种不同的长度,与一个较短的第一,所以我不知道什么是“最大的长度”的意思。但是,这可能会有帮助:

use Tree::Suffix; 
my $string1 = '(i==i)kn;i=n.n;k(i(i,"%i",&i);i'; 
my $string2 = 'k;kn;i=n.n;k;k(i(i,"%i",&i);k'; 
my $tree = Tree::Suffix->new($string1, $string2); 
my @answer; 
my $min_length = 1; 
my $max_length = 0; # 0 initially means no limit 
do { 
    my @by_length = $tree->lcs($min_length,$max_length); 
    last unless @by_length; 
    # don't include any substrings that are substrings of substrings already found 
    for my $new_substring (@by_length) { 
     push @answer, $new_substring if 0 == grep $_ =~ /\Q$new_substring/, @answer; 
    } 
    $max_length = length($by_length[0])-1; 
} while $max_length >= $min_length; 
use Data::Dumper; 
print Dumper \@answer; 

输出:

$VAR1 = [ 
     ';k(i(i,"%i",&i);', 
     'kn;i=n.n;k' 
    ]; 

树::后缀是那种安装疼痛;我必须删除包含的inc/Devel/CheckLib.pm,因为它存在错误,并单独安装Devel :: CheckLib,以及下载和安装libstree库。

+0

谢谢,您已经注意到正确的“最大长度” - “不包含任何子字符串已经找到的子字符串”。结果算法的复杂性是什么? (使用指针〜O(n^2)),“tree-> lcs”花费多少钱? –

+0

我相信它是O(n * m)(两个字符串的长度相乘);我认为任何可能的lcs算法都是如此。 – ysth

+0

我在使用cygwin安装Devel :: CheckLib时遇到了问题。它找不到标准C库,但它们在那里。这个bug必须在1.02中解决,但它仍然存在。如果您在这种情况下有一些建议,请告诉我。我完全被卡住了。 http://stackoverflow.com/questions/27025003/while-the-perl-devel-checklib-installation-in-cygwin-make-test-returns-the-er –

相关问题