如何实现子串算法

时间:2010-08-16 18:20:14

标签: python algorithm

我正在尝试实现一个算法来获取长度为n的字符串,并返回长度为2或更大的所有子字符串。

如果用户输入一个字符串,例如“abcd”,那么输出应该是 ab,bc,cd,abc,bcd,abcd。

a=input("Ente the input")
list=[]
com=""
for k in range(2,len(a)+1):
    for x in range(k,len(a)+1):
        com=""
        for j in range(x-k,k);
            com=com+a[j]
        print com
        list1.append(com)

print list1

7 个答案:

答案 0 :(得分:2)

>>> [ a[ index : index + length ] for index in range( len( a ) - 1 ) for length in range( 2, len( a ) - index + 1 ) ]
['ab', 'abc', 'abcd', 'bc', 'bcd', 'cd']

如果您需要列出的列表:

>>> sorted( [ a[ index : index + length ] for index in range( len( a ) - 1 ) for length in range( 2, len( a ) - index + 1 ) ], key = len )
['ab', 'bc', 'cd', 'abc', 'bcd', 'abcd']

您的算法存在严重问题,因为它应该只执行两个循环(一个用于启动索引,一个用于子串的长度)。但是,我不明白你想要做什么,所以我不能尝试修复它。

编辑:我明白了 - 你是逐个字符地复制字符串!你是一个C程序员吗? = p你不必在Python中做那种事情;它是一种更高级的语言。如果切片字符串(a[1:3]),您将获得它的子字符串,您可以将其附加到列表或以其他方式存储。在上面,我们首先遍历所有索引直到字符串的末尾(减去1,因为“d”不是有效的子字符串),然后遍历所有“适合”的子字符串长度。这会产生所有可能的子串;我们可以使用列表理解符号来很容易地列出它们。

答案 1 :(得分:2)

from  itertools import combinations
map(lambda i: a[i[0]:i[1]+1],combinations(range(len(a)),2))

答案 2 :(得分:1)

minlength = 2
def sub(string):
    return [string[start:start+length] 
        for length in xrange(minlength, len(string) + 1)
            for start in xrange(len(string) - length + 1) ]
print sub('abcd')
['ab', 'bc', 'cd', 'abc', 'bcd', 'abcd']

答案 3 :(得分:0)

如果要输出从最短到最长的结果

>>> s="abcd"
>>> for substrlength in range(2, len(s)+1):
...     for start in range(len(s)+1-substrlength):
...         print s[start:start+substrlength]
...
ab
bc
cd
abc
bcd
abcd

将结果存储在列表中

>>> s="abcd"
>>> resultlist=[]
>>> for substrlength in range(2, len(s)+1):
...     for start in range(len(s)+1-substrlength):
...         resultlist.append(s[start:start+substrlength])
...
>>> print resultlist
['ab', 'bc', 'cd', 'abc', 'bcd', 'abcd']

答案 4 :(得分:0)

以下是要比较的代码的错误修复版本,但有更好的方法可以在此处编写

a=raw_input("Enter the input")
list1=[]
com=""
for k in range(2,len(a)+1):
    for x in range(k,len(a)+1):
        com=""
        for j in range(x-k,x):
            com=com+a[j]
        print com
        list1.append(com)

print list1

答案 5 :(得分:0)

在python 2.6中,他们添加了一些很酷的功能,使这很容易:

from itertools import combinations

def substrings(text, length=2):
    textlen = len(text)
    for low, hi in combinations(range(textlen), 2):
        if hi-low >= length:
            yield text[low:hi]

s = raw_input("Enter the input: ")
for substr in substrings(s):
    print len(substr), repr(substr)

请注意,substrings()是一个生成器(请参阅yield语句),这样可以提高内存效率,但如果您确实需要列表,则可以说mylist = list(substrings('foo'))

如果您想要生成其他长度的子串,我还为子串添加了一个参数。

答案 6 :(得分:0)

一个简洁的递归版本,很好的衡量标准:

def substr(s, min_len):
   if len(s) < min_len:
       return []
   return [s[i:i+min_len] for i in range(len(s) - min_len + 1)] + substr(s, min_len + 1)