【问题标题】:Generating all the covering substrings of a string生成字符串的所有覆盖子字符串
【发布时间】:2010-08-26 16:42:36
【问题描述】:

你如何做到以下几点:给定一个字符串,生成所有可能的方法来将该字符串解析为子字符串(时间很重要,空间无关紧要)。 例如,给定字符串 ABCD,我需要生成:

ABCD

A BCD

A BC D

A B CD

AB CD

AB C D

ABC D

A B C D

可能是一个递归解决方案,但我无法让它发挥作用。

【问题讨论】:

    标签: string substring sequences


    【解决方案1】:

    Python 中的另一种解决方案,无需递归:

    def substrings(s):
        for k in xrange(1, len(s)+1):
            for i in xrange(len(s)-k+1):
                yield s[i:i+k]
    

    这样

    >>> print list(substrings("ABCD"))
    ['A', 'B', 'C', 'D', 'AB', 'BC', 'CD', 'ABC', 'BCD', 'ABCD']
    

    【讨论】:

    • 谢谢!对于 Python3,只需将 xrange 替换为 range,一切正常!
    【解决方案2】:

    Python:

    def splitstring(s):
      result = [s]
      for i in range(1, len(s)):
        result.extend('%s %s' % (s[:i], x) for x in splitstring(s[i:]))
      return result
    

    【讨论】:

    • 谢谢,这帮助很大。我在 Perl 中成功地重新实现了它
    【解决方案3】:

    要获得特定的拆分:

    • 首先,确定要拆分的索引;
    • 然后,在给定索引处拆分字符串。

    对于长度为n 的字符串,一组给定的拆分索引是{1, ..., n}powerset 的一个元素。

    在python中:

    from itertools import combinations, chain
    
    def powerset(iterable):
        "powerset([1,2,3]) --> () (1,) (2,) (3,) (1,2) (1,3) (2,3) (1,2,3)"
        s = list(iterable)
        return chain.from_iterable(combinations(s, r) for r in range(len(s)+1))
    
    def pairs(seq, end):
        "pairs([13,23,33], 55) --> (0,13) (13,23) (23,33) (33,55)"
        return zip(chain((0,), seq), chain(seq, (end,)))
    
    def allsplits(s):
        "allsplits('abc') --> ['abc'] ['a', 'bc'] ['ab', 'c'] ['a', 'b', 'c']"
        for split_indices in powerset(range(1,len(s))):
            yield [s[i:j] for i,j in pairs(split_indices, len(s))]
    
    print(list( allsplits('abcd') ))
    # [['abcd'], ['a', 'bcd'], ['ab', 'cd'], ['abc', 'd'], ['a', 'b', 'cd'], ['a', 'bc', 'd'], ['ab', 'c', 'd'], ['a', 'b', 'c', 'd']]
    

    【讨论】:

      猜你喜欢
      • 2021-02-02
      • 1970-01-01
      • 2011-02-03
      • 2014-03-12
      • 1970-01-01
      • 2012-10-23
      • 2019-07-18
      • 2012-04-08
      相关资源
      最近更新 更多