【问题标题】:Perl: Find all matched substrings of two stringsperl:查找两个字符串的所有匹配子串
【发布时间】:2015-01-11 06:14:57
【问题描述】:

也许有一个函数,它可以在 perl 中找到 string1 和 string2 的每个(最大长度)相等的子字符串,不是吗?

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

为了搜索所有相等的子字符串,我必须移动 string1 的开始指针并逐个符号比较字符串。我怎样才能在 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);", ... );

【问题讨论】:

  • 听起来像是功课……
  • 抄袭C源代码检查系统-检查作业,我在Perl中的第一个程序)))
  • 显示示例输入和输出?我不太明白你的要求。
  • 我添加了一个例子

标签: string perl comparison substring maxlength


【解决方案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'
    ];

Tree::Suffix 安装起来有点麻烦;我不得不删除包含的 inc/Devel/CheckLib.pm,因为它有错误并单独安装 Devel::CheckLib,以及下载和安装 libstree 库。

【讨论】:

  • 谢谢你,你已经注意到了,“最大长度”-“不包括任何已经找到的子串的子串”。结果算法的复杂度是多少? (使用指针 ~ O(n^2)),“tree->lcs”的成本是多少?
  • 我相信是O(n*m)(两个字符串的长度相乘);我认为任何可能的 lcs 算法都是如此。
  • 我在使用 cygwin 安装 Devel::CheckLib 时遇到问题。它找不到标准的 C 库,但它们在那里。这个错误必须在 1.02 中解决,但它仍然存在。如果您在这种情况下有一些建议,请告诉我。我完全被困住了。 stackoverflow.com/questions/27025003/…
  • Devel::CheckLib 如果找不到已安装的 libstree,则会提供一个很好的错误消息;您应该可以通过在 Tree::Suffix 的 Makefile.PL 中注释掉 use 和 check_lib_or_exit 调用来跳过它。
  • perl 是否有另一个库来构建后缀树?我放弃!因为,cpan 实用程序无法安装原始存档或已更改程序的存档,(哈希和不相等)。 Active Perl 的包管理器不支持这个库。而且每次cygwin都找到新的原因,为什么不能安装。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-27
  • 2018-12-07
  • 2016-04-20
  • 1970-01-01
  • 2023-01-06
  • 1970-01-01
相关资源
最近更新 更多