查找所有字符串拆分组合

Posted

技术标签:

【中文标题】查找所有字符串拆分组合【英文标题】:Find all string split combinations 【发布时间】:2018-06-03 02:31:31 【问题描述】:

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

“我在吃披萨”

我想得到这个输出:

[["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"]]

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

【问题讨论】:

有 2^n 个结果,n 是可能发生拆分的位置数。可以看成一个二进制数,每个1代表这里拆分,每个0代表这里不拆分。现在你只需要迭代和解释数字。 首先根据空白字符拆分所有标记,然后构建所有可能的组合。 所谓的重复如何是这个问题的重复?另一张票是关于有序组合的,这是关于所有可能的拆分。另一个答案允许 e。 G。结果"I" 而这个问题没有。要么我太傻了,看不到这两个问题明显相等,要么他们根本不一样,在这种情况下,我想要求所有重复投票者在进行这样的投票时更加彻底。 @Alfe 完全同意,我真的不明白为什么它被投票为重复 @Alfe:我认为您或 Mohamed 都应该对此发表答案。您提出了一个简单而有效的算法,甚至是一个实现。没有答案的问题是可悲的...... 【参考方案1】:

细分和重复

这是一种使用递归函数的方法——以及我是如何设计的:

使用索引i 扫描字符串s 如果索引超出范围,则返回基本结果[[s]],否则... 如果在索引处找到" ",则将问题细分为AB两部分并合并它们的结果,否则前进到下一个索引。 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']
# ]

【讨论】:

【参考方案2】:

感谢 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)

【讨论】:

以上是关于查找所有字符串拆分组合的主要内容,如果未能解决你的问题,请参考以下文章

R语言之字符串的组合与拆分

PL/SQL Regex 查找最后一个数字并拆分

如何使用 re.split 在 python 中拆分两列从 CSV 中查找字符串值

拆分列数据[重复]

如何在特定字符处拆分字符串并构建不同的字符串组合[关闭]

字符串拆分-查找字符