我正在寻找可能适用于此问题的模块,正则表达式或其他任何内容.
我如何以编程方式解析字符串并创建已知的英语& |西班牙语单词,我有一个字典表,我可以检查算法的随机化匹配的每个排列?
鉴于一组字符:EBLAIDL KdioIDSI ADHFWB
该计划应该返回:BLADE AID KID KIDS FIDDLE HOLA等….
我还希望能够定义最小值和最小值.最大字长以及音节数
输入长度无关紧要,它必须只是字母,标点符号无关紧要.
谢谢你的帮助
输入字符串中的EDITLetters可以重复使用.
例如,如果输入为:ABLED,则输出可能包含:BALL或BLEED
解决方法
你没有指定,所以我假设输入中的每个字母只能使用一次.
[你已经指定输入中的字母可以多次使用,但我会在这里留下这篇文章以防有人发现它有用.]
有效地做到这一点的关键是对单词中的字母进行排序.
abracadabra => AAAAABBCDRR abroad => AABDOR drab => ABDR
然后很明显“drab”在“abracadabra”中.
abracadabra => AAAAABBCDRR drab => A B DR
那“国外”不是.
abracadabra => AAAAABBCD RR abroad => AA B DOR
我们将排序后的字母称为“签名”.如果您可以从“A”的签名中删除字母以获得“B”的签名,则单词“B”in在单词“A”中.使用正则表达式模式很容易检查.
sig('drab') =~ /^A?A?A?A?A?B?B?C?D?R?R?\z/
或者,如果我们为了效率而消除不必要的回溯,我们就会得到
sig('drab') =~ /^A?+A?+A?+A?+A?+B?+B?+C?+D?+R?+R?+\z/
既然我们知道我们想要什么样的模式,那只需要构建它.
use strict; use warnings; use feature qw( say ); sub sig { join '',sort grep /^\pL\z/,split //,uc $_[0] } my $key = shift(@ARGV); my $pat = sig($key); $pat =~ s/.\K/?+/sg; my $re = qr/^(?:$pat)\z/s; my $shortest = 9**9**9; my $longest = 0; my $count = 0; while (my $word = <>) { chomp($word); next if !length($word); # My dictionary starts with a blank line!! next if sig($word) !~ /$re/; say $word; ++$count; $shortest = length($word) if length($word) < $shortest; $longest = length($word) if length($word) > $longest; } say "Words: $count"; if ($count) { say "Shortest: $shortest"; say "Longest: $longest"; }
例:
$perl script.pl EBLAIDL /usr/share/dict/words A Abe Abel Al ... libel lid lie lied Words: 117 Shortest: 1 Longest: 6