查找大字符串的子序列

时间:2017-02-09 05:43:26

标签: python

我正在尝试获取字符串的所有子序列。例如: -

firstString = "ABCD"

O / P应该是;

'ABCD', 'BCD', 'ACD', 'ABD', 'ABC', 'CD', 'BD', 'BC', 'AD', 'AC', 'AB', 'D', 'C', 'B', 'A'

为此,我使用以下部分代码: -

#!usr/bin/python

from __future__ import print_function
from operator import itemgetter
from subprocess import call
import math
import itertools
import operator

call(["date"])

firstArray = []

firstString = "ABCD"

firstList = list(firstString)

for L in range(0, len(firstList)+1):
    for subset in itertools.combinations(firstList, L):

            firstArray.append(''.join(subset))

firstArray.reverse()

print (firstArray)

call(["date"])

但是这段代码不可扩展。

如果我提供: -

firstString = "ABCDABCDABCDABCDABCDABCDABCD"

该计划需要将近6分钟的时间才能完成。

----------------运行脚本时捕获--------------------

python sample-0012.py
Wed Feb  8 21:30:30 PST 2017
Wed Feb  8 21:30:30 PST 2017

有人可以帮忙吗?

4 个答案:

答案 0 :(得分:0)

您正在寻找的是“电源组”(或Powerset)。 维基百科def:

  

任何集合的幂集(或powerset)S是S的所有子集的集合,   包括空集和S本身。

一个好的解决方案可能是递归的,在这里你可以找到一个: link

答案 1 :(得分:0)

  

为了更好地处理powerset概念,   How to get all possible combinations of a list’s elements?

 otherwise, you can do like this. 
    wordlist = []    
    for i in range(len(firststring)):
            ...:     comblist = combinations(list(firststring), i+1)
            ...:     same_length_words = []
            ...:     for i, word in enumerate(comblist):
            ...:         if word not in same_length_words:
            ...:             same_length_words.append(word)
            ...:     for each_word in same_length_words:
            ...:         wordlist.append(''.join(each_word))
            ...:

答案 2 :(得分:0)

试试这个

from itertools import chain, combinations
firstString = 'ABCD'
data = list(firstString)
lists =  chain.from_iterable(combinations(data, r) for r in range(len(data)+1))
print [''.join(i) for i in lists if i]

# ['A', 'B', 'C', 'D', 'AB', 'AC', 'AD', 'BC', 'BD', 'CD', 'ABC', 'ABD', 'ACD', 'BCD', 'ABCD']

答案 3 :(得分:0)

使用递归->选择和不选择概念

您必须做出一个决定,就是要选择要添加到字符串中的元素还是不添加到字符串中。基于这种方法,我们有了此递归解决方案。

def subse(string,current,index,n):
    if index == n:
        print(current)
        return;
    else:
        subse(string,current+string[index],index+1,n) #pick element and add it to output string that is current
        subse(string,current,index+1,n) #don't pick 

if __name__ == "__main__": 
    subse('abc','',0,3)