2014-11-13 2 views
-1

Возможно, существует функция, которая может найти каждую (максимальную по длине) равную подстроку string1 и string2 в perl, не так ли?Perl: Найти все совпадающие подстроки из двух строк

Я могу найти каждую подстроку в строке, используя m/substring/g;.

Для поиска всех одинаковых подстрок, я должен сдвинуть указатель на строки begin1 и string-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 - проверка домашних заданий, Моя первая программа в 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

У меня проблема при установке Devel :: CheckLib с использованием cygwin. Он не может найти стандартные библиотеки C, но они есть. Эта ошибка должна быть решена в 1.02, но она все еще существует. Если у вас есть предложения в этом случае, пожалуйста, сообщите мне об этом. Я полностью застрял. http://stackoverflow.com/questions/27025003/while-the-perl-devel-checklib-installation-in-cygwin-make-test-returns-the-er –

Смежные вопросы