【问题标题】:Find all possible varients of max pair of 2找到最大对 2 的所有可能变体
【发布时间】:2022-11-22 05:51:23
【问题描述】:

给定一串数字,如 123456,我想找到所有不同的可能性,它们可以由 2 配对或由它自己配对。例如,从字符串 123456 我想得到:12 3 4 5 6、12 34 5 6、1 23 4 56 等

我能找到的最近的地方是:

strr = list("123456")
x = list("123456")

for i in range(int(len(strr)/2)):
    newlist = []
    for j in range(i):
        newlist.append(x[j])
    newlist.append(x[i] + x[i+1])
    for j in range(len(x))[i+2:]:
        newlist.append(x[j])
    x = newlist.copy()
    b = x.copy()
    for f in range(len(b))[i:]:
        if f == i:
            print(b)
            continue
        b[f] = b[f - 1][1] + b[f]
        b[f - 1] = b[f - 1][0]
        print(b)

此代码给出输出: output

【问题讨论】:

  • 你看过 itertools.combinations 了吗?您可以单独添加“单字母”部分,但这里是两个字母组合的单行示例:from itertools import combinations choices = [''.join(comb) for comb in combinations('123456', 2)]
  • 你好;请将输出作为文本而不是图像发布。也就是说,这种算法通常最好递归编码。 @BenY:这可以帮助编写递归函数的代码,但本身并不能回答问题。
  • 我相信我的是一个建议,而不是答案。两次调用会给出结果,尽管问题没有指定顺序、选择等。

标签: python


【解决方案1】:

用递归生成器很容易解决这个问题。这类似于解决找零问题的方式,只是在这里我们只有两个“硬币”,要么两个字符在一起,要么一次一个字符。我们试图做出的总改变是输入字符串的长度。字符是数字字符串中的数字这一事实是无关紧要的。

def singles_and_pairs(string):
    if len(string) <= 1:             # base case
        yield list(string)           # yield either [] or [string] and then quit
        return

    for result in singles_and_pairs(string[:-1]): # first recursion
        result.append(string[-1:])
        yield result

    for result in singles_and_pairs(string[:-2]): # second recursion
        result.append(string[-2:])
        yield result

如果你计划在大输入字符串上运行它,你可能想要添加记忆,因为递归调用经常重新计算相同的结果。

【讨论】:

  • 我检查了“123”,它返回 [['1', '2', '3'], ['12', '3'], ['1', '23']]: ['13', '2'] 丢失。
【解决方案2】:

Pheew,这个花了我一些时间才弄好,但它似乎终于奏效了:

def max_2_partitions(my_string):
    if not my_string:
        return [[]]
    if len(my_string) == 1:
        return [[my_string]]
    ret = []
    for i in range(len(my_string)):
        for l in max_2_partitions(my_string[:i] + my_string[i + 1:]):
            li = sorted([my_string[i]]+l)
            if li not in ret:
                ret.append(li)
        for j in range(i+1,len(my_string)):
            for l in max_2_partitions(my_string[:i]+my_string[i+1:j]+my_string[j+1:]):
                li = sorted([my_string[i] + my_string[j]] + l)
                if li not in ret:
                    ret.append(li)
    return ret

例子:

print(max_2_partitions("1234"))
# [['1', '2', '3', '4'], ['1', '2', '34'], ['1', '23', '4'], ['1', '24', '3'], ['12', '3', '4'], ['12', '34'], ['13', '2', '4'], ['13', '24'], ['14', '2', '3'], ['14', '23']]

【讨论】:

    猜你喜欢
    • 2016-02-25
    • 1970-01-01
    • 2011-03-08
    • 2012-05-27
    • 2017-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多