Python 如何实现子串算法

Python 如何实现子串算法,python,algorithm,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); co

我正在尝试实现一种算法,以获取长度为
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
如果需要对列表进行排序:

>>> 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]
),你会得到它的一个子字符串,你可以把它附加到一个列表或其他存储中。在上面,我们首先迭代所有索引,直到字符串末尾(因为“d”不是有效的子字符串,所以减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']
如果需要对列表进行排序:

>>> 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]
),你会得到它的一个子字符串,你可以把它附加到一个列表或其他存储中。在上面,我们首先迭代所有索引,直到字符串末尾(因为“d”不是有效的子字符串,所以减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']
>>> 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']

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

>>> 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']

这里有一个代码的bug修复版本可供比较,但这里有更好的编写方法

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

这里有一个代码的bug修复版本可供比较,但这里有更好的编写方法

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

在Python2.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'))


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

在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'))


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

一个简洁的递归版本,用于衡量:

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)
def substr(s,min_len):
如果长度小于最小长度:
返回[]
返回[s[i:i+min\u len],用于范围内的i(len(s)-min\u len+1)]+substr(s,min\u len+1)

一个简洁的递归版本,用于良好的度量:

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)
def substr(s,min_len):
如果长度小于最小长度:
返回[]
返回[s[i:i+min\u len],用于范围内的i(len(s)-min\u len+1)]+substr(s,min\u len+1)

您没有实现搜索引擎。请详细说明您的问题。不清楚期望的输出应该是什么。这听起来更像是一个排列或子序列引擎。。。或“搜索”以外的其他内容。用户输入一个类似“bridge”的字符串…输出必须是br、ri、id、dg、ge、bri、rid、idg、dge、BRD、ridg…这是一个子序列列表器。不是搜索引擎。如果您想搜索一个小字符串是否在一个大字符串中,那么只需在“bridge”中执行“bri”即可。您没有实现搜索引擎。请详细说明您的问题。不清楚期望的输出应该是什么。这听起来更像是一个排列或子序列引擎。。。或“搜索”以外的其他内容。用户输入一个类似“bridge”的字符串…输出必须是br、ri、id、dg、ge、bri、rid、idg、dge、BRD、ridg…这是一个子序列列表器。不是搜索引擎。如果您想搜索一个小字符串是否包含在一个大字符串中,那么只需在“bridge”中执行
“bri”
“bridge”“bri”就可以了……thnks代表您的输入。thnks代表您的输入。thnks代表您的输入。thnks代表您的输入。。