Perl:做最长前缀匹配的最佳方法(字符串)

时间:2015-08-03 02:07:21

标签: perl longest-prefix

我有一个大约5000字的列表。我想在给定单词的那些单词中找到最长的前缀匹配。例如,在我的列表中,我有:

1
121
12234
20345
21345

现在如果我搜索12134,结果将是121(最长匹配)。我知道它可以用不同的方式完成。但是,什么应该是最有效的方式?

2 个答案:

答案 0 :(得分:3)

#!/usr/bin/env perl

use strict;
use warnings;

my @prefixes = qw(
    1
    121
    12234
    20345
    21345
);

my $num = '12134';

my ($longest) = sort { length $b <=> length $a } grep { 0 == index $num, $_ } @prefixes;

print "$longest\n";

输出

121

答案 1 :(得分:1)

您可以使用正则表达式引擎为您执行此操作。它应该非常快

我希望很明显正则表达式模式只需要构建一次,然后可以用来为任意数量的目标字符串找到最长的前缀

use strict;
use warnings;
use 5.010;

my @prefixes = qw/
    1
    121
    12234
    20345
    21345
/;

my $target = 12134;

my $re = join '|', sort { length $b <=> length $a } @prefixes;
$re = qr/(?:$re)/;

say $1 if $target =~ /^($re)/;

输出

121

更新

或者,Tree::Trie模块可用于实现正则表达式引擎提供的trie搜索

use strict;
use warnings;
use 5.010;

use Tree::Trie;

my @prefixes = qw/
    1
    121
    12234
    20345
    21345
/;

my $target = 12134;

my $trie = Tree::Trie->new({ deepsearch => 'prefix' });
$trie->add(@prefixes);

say scalar $trie->lookup($target);

当然,输出与前一代码的输出相同