2014-11-13 65 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 –

相關問題