我有一个字符串27AAGCB5913L2ZF
,如果字符串中出现A
或J
或K
中的任何一个,那么我需要将它们更改为这三个字母的所有可能组合,如果我将上面的字符串输入传递给程序,那么输出应该是这样的
27AAGCB5913L2ZF
27AJGCB5913L2ZF
27AKGCB5913L2ZF
27JAGCB5913L2ZF
27KAGCB5913L2ZF
27KJGCB5913L2ZF
27JKGCB5913L2ZF
27JJGCB5913L2ZF
27KKGCB5913L2ZF
这些字母可以出现在字符串中的任何位置。如果只出现一个字母,则必须依次替换为A
、J
和K
。例如,字符串27ABGCB5913L2ZF
的输出应如下所示
27ABGCB5913L2ZF
27JBGCB5913L2ZF
27kBGCB5913L2ZF
我可以用这样的代码搜索给定的字符
while ( $string =~ /(B)/g ) {
say $1, ' at ', pos $string;
}
如果在任何位置都可以有任意数量的A
、J
或K
,我如何生成所有可能的字符串?
4条答案
按热度按时间slwdgvem1#
你想要的关键字母
A
、J
和K
的组合集合叫做Cartesian product,在Python中,你可以使用itertools.product
来生成它们。首先,我们需要找到输入字符串中所有关键字母的位置,最简单的方法是使用内置的
enumerate
函数,一旦知道了这些位置,以及字符串包含多少个关键字母,我们就可以生成笛卡尔积的每一项,替换关键字母,并打印新的字符串。在Python中,字符串是不可变的(它们不能被改变),所以我将字符串转换为字符列表,替换关键位置的字符,然后使用
str.join
方法从列表中构建一个新的字符串。以下代码适用于Python版本2和3
巨蟒
输出
只要做一点小改动,我们就可以把函数变成一个生成器,这样你就可以轻松地循环输出字符串,或者把它们变成一个列表。
巨蟒
输出
vom3gejh2#
这可以在Perl中通过使用
glob
操作符来完成。glob
用于查找匹配的文件,但是如果模式中不包含通用通配符(*
、?
或[...]
),则它将只返回所有可能的匹配项,而不管它们是否作为文件存在这个Perl代码使用一个替换来形成一个glob模式,方法是用多重模式
{A,J,K}
替换所有出现的A
、J
或K
。输出
wnrlj8wa3#
一个简短的解决方案:
首先将字符串拆分为可能出现在每个位置的字符元组
然后这个函数将把元组列表重新组合成一个字符串:
bkhjykvo4#
下面是Perl中的递归解决方案: