查找所有字符串拆分组合

问题描述 投票:4回答:2

我正在寻找一种从句子中获取所有字符串拆分组合的方法。例如,对于输入的发送:

“我正在吃披萨”

我想得到这个输出:

[["I", "am", "eating", "pizza"],
["I", "am eating", "pizza"],
["I", "am", "eating pizza"],
["I", "am eating pizza"],
["I am", "eating", "pizza"],
["I am", "eating pizza"],
["I am eating", "pizza"],
["I am eating pizza"]]

我无法找到这样做的递归方式!你有什么主意吗 ?这不是重复:我不是在寻找整个组合,只是订购商品,而是整个单词。无法从所谓的重复中找到我的答案。

python arrays string recursion
2个回答
1
投票

细分和复发

这是一种使用递归函数可以实现的方法 - 以及我如何处理设计:

  • 使用索引s扫描字符串i
  • 如果索引超出范围,则返回基本结果[[s]],否则......
  • 如果在索引处找到" ",则将问题细分为A和B两部分并合并其结果,否则前进到下一个索引。
  • A部分:在这个空间上拆分,在它之前添加单词到递归结果中的每个项目。
  • B部分:不要拆分这个空间,前进到下一个索引
# split :: String -> [[String]]
def split (s, i = 0):
  if len(s) == i:
    return [[s]]
  elif s[i] == " ":
           # Part A                                     # Part B
    return [[s[0:i]] + acc for acc in split(s[i + 1:])] + split(s, i + 1)
  else:
    return split(s, i + 1)

print(split("i am eating pizza"))

# [ ['i', 'am', 'eating', 'pizza'], 
# , ['i', 'am', 'eating pizza']
# , ['i', 'am eating', 'pizza']
# , ['i', 'am eating pizza']
# , ['i am', 'eating', 'pizza']
# , ['i am', 'eating pizza']
# , ['i am eating', 'pizza']
# , ['i am eating pizza']
# ]

1
投票

感谢Alfe提供的2 ^ n组合提示。

这是一些与他的想法相对应的代码。

import itertools
input_string = "I am eating pizza"
split_string = input_string.split(' ')
lst = list(itertools.product([0, 1], repeat=len(split_string) - 1))

res = [] 
for entry in lst:
    round_output = []
    current = split_string[0]
    for i in range(len(entry)):
        if entry[i] == 1:
            current += ' ' + split_string[i+1]
        else:    
            round_output.append(current)
            current = split_string[i+1]
    round_output.append(current)
    res.append(round_output)
© www.soinside.com 2019 - 2024. All rights reserved.