String 生成所有字符串组合的算法

String 生成所有字符串组合的算法,string,algorithm,combinations,permutation,String,Algorithm,Combinations,Permutation,假设我有一个字符串列表,如下所示: strings = ["abc", "def", "ghij"] 请注意,列表中字符串的长度可能会有所不同 生成新字符串的方法是按顺序从列表的每个元素中提取一个字母。示例:“adg”和“bfi”,但不是“dch”,因为字母在列表中的显示顺序不同。因此,在这种情况下,我知道列表中只有三个元素,我可以相当容易地使用嵌套for循环结构生成所有可能的组合,如下所示: for i in strings[0].length: for ii in strings[1

假设我有一个字符串列表,如下所示:

strings = ["abc", "def", "ghij"]
请注意,列表中字符串的长度可能会有所不同

生成新字符串的方法是按顺序从列表的每个元素中提取一个字母。示例:“adg”和“bfi”,但不是“dch”,因为字母在列表中的显示顺序不同。因此,在这种情况下,我知道列表中只有三个元素,我可以相当容易地使用嵌套for循环结构生成所有可能的组合,如下所示:

for i in strings[0].length:
   for ii in strings[1].length:
      for iii in strings[2].length:
         print(i+ii+iii)
当我不知道字符串列表将提前多长时间时,问题就出现了。如果列表有n个元素,那么我的解决方案需要n个元素才能成功循环


有谁能告诉我一个相对简单的解决方案吗?我正在考虑一种基于DFS的解决方案,其中我将每个字母转换为一个节点,并在相邻字符串中的所有字母之间创建连接,但这似乎太费劲了。

以下是我在Javascript中的实现方法(我假设每个字符串都不包含重复字符):

在python中,您将使用

例如:

itertools.product(“abc”、“def”、“ghij”)中的梳子的
>>:
>>>打印(''.join(comb))
adg
adh
阿迪
形容词
aeg
啊
...
或者,使用解包:

单词=[“abc”,“def”,“ghij”] >>>打印('\n'.join(''.join(comb)用于itertools.product(*words)中的comb) (输出相同)
product
使用的算法非常简单,从其源代码中可以看出(请特别关注函数
product\u next
)。它基本上枚举混合基系统中所有可能的数字(其中每个数字位置的乘数是对应字的长度)。一个仅适用于字符串而不实现
repeat
关键字参数的简单实现可能是:

def产品(文字): 如果文字和全部(len(w)表示文字中的w): 索引=[0]*len(字) 尽管如此: #更改“”。连接到元组以获得更准确的实现 产生“”。在枚举(单词)中为i,w连接(w[索引[i]] 对于范围内的i(len(索引),0,-1): 如果索引[i-1]==len(字[i-1])-1: 指数[i-1]=0 其他: 指数[i-1]+=1 打破 其他: 打破
从您的解决方案来看,似乎您需要使用与字符串数量相同的
for
循环。对于在最后一个字符串中生成的每个字符,您需要一个
For
循环,遍历可能的字符列表。要做到这一点,您可以使用递归解决方案。每次在递归中深入一级,只需为循环运行一个
。递归的级别和字符串的级别一样多

以下是python中的一个示例:

strings = ["abc", "def", "ghij"]

def rec(generated, k):
    if k==len(strings):
        print(generated)
        return

    for c in strings[k]:
        rec(generated + c, k+1)

rec("", 0)

这是蟒蛇吗?它看起来像python。。。(除了我不知道
.length
在那里做什么)方便,但我不一定使用Python,尽管我的psuedo代码非常像Python。@jimmy:很公平。很容易找到itertools.product的实现;在我提供的链接中有一个,但我并不建议使用它。这里有一个更好的:@Jimmy_Rustle:添加了一个实现fwiw。,
adg adh adi adj aeg aeh aei aej afg afh afi afj bdg bdh bdi 
bdj beg beh bei bej bfg bfh bfi bfj cdg cdh cdi cdj ceg ceh 
cei cej cfg cfh cfi cfj
strings = ["abc", "def", "ghij"]

def rec(generated, k):
    if k==len(strings):
        print(generated)
        return

    for c in strings[k]:
        rec(generated + c, k+1)

rec("", 0)