Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 从python中的字符串获取所有子字符串?_Python 3.x - Fatal编程技术网

Python 3.x 从python中的字符串获取所有子字符串?

Python 3.x 从python中的字符串获取所有子字符串?,python-3.x,Python 3.x,在不使用任何模块和不进行重复的情况下,查找字符串中所有子字符串的最快方法是什么 def lols(s): if not s: return 0 lst = [] for i in range (len(s)): for j in range(i , len(s)+1): if not s[i:j] : pass elif len(s[i:j]) == le

在不使用任何模块和不进行重复的情况下,查找字符串中所有子字符串的最快方法是什么


def lols(s):

    if not s:
        return 0
    lst = [] 
    for i in range (len(s)):
        for j in range(i , len(s)+1):
            if not s[i:j] :
                pass
            elif len(s[i:j]) == len(set(s[i:j])):
                lst.append(s[i:j])

    res =  (max(lst , key=len))


s = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~"
s = s*100

lols(s)


def LOL(s):
如果不是,则:
返回0
lst=[]
对于范围内的i(len(s)):
对于范围(i,len(s)+1)内的j:
如果不是s[i:j]:
通过
elif len(s[i:j])==len(set(s[i:j]):
附加(s[i:j])
res=(最大值(lst,键=len))
s=“abcdefghijklmnopqrstuvxyzabefghijklmnopqrstuvxyz012456789!\”#$%&'()*+,-./:@[\\]^_`{|}~"
s=s*100
lols(s)
此函数适用于小于1000的字符串,但在使用示例字符串且超过大字符串的时间限制时会冻结


我建议您不要使用超长字符串(如
s
)来尝试此操作。

如果您能够安装
nltk
,使其正常工作(我最近遇到了一个问题,但通过将其安装到Windows沙盒中解决了这个问题,请参见此处:),那么这是一种方法

from nltk import ngrams

def lols(s):
    lst = []
    for i in range(1, len(s)):
        lst.extend([''.join(j) for j in ngrams(s, i)])
    lst.append(s)
    return lst
如果没有,您可以这样做,而不是“从nltk导入ngrams”

演示:


可能您的函数性能会减慢,例如n2或n!(O(n2)或O(n!)),或者内存很紧。 关于您可以使用打印函数在标准输出中打印的字符串的最大大小,因为您必须将文本作为python对象传递给打印函数,并且由于变量的最大大小取决于您的平台,所以在32位平台上它可以是2**31-1,在64位平台上它可以是2**63-1


有关更多信息,请访问

这是leetcode上的一个问题,您不允许使用库来解决它。哎哟,我在发布我的第一个答案后才注意到。据我所知,“收藏”和“itertools”“是标准库的一部分,因此不应该有不包含它们的python环境,但是在任何情况下,如果您可以用纯python实现“ngrams”(即特定长度的子字符串),这里介绍了一种纯python的生成ngrams的方法:尽管您必须删除一些不必要的行,并在return语句之前的行中将“token”替换为“s”(并将函数重命名为“ngrams”或在我编写的函数中调用“generatengrams”)。
import collections, itertools

def ngrams(words, n):
    """Edited from https://stackoverflow.com/questions/17531684/n-grams-in-python-four-five-six-grams"""
    d = collections.deque(maxlen=n)
    d.extend(words[:n])
    words = words[n:]
    answer = []
    for window, word in zip(itertools.cycle((d,)), words):
        answer.append(''.join(window))
        d.append(word)
    answer.append(''.join(window))
    return answer
>>> lols('username')
['u', 's', 'e', 'r', 'n', 'a', 'm', 'e', 'us', 'se', 'er', 'rn', 'na', 'am', 'me', 'use', 'ser', 'ern', 'rna', 'nam', 'ame', 'user', 'sern', 'erna', 'rnam', 'name', 'usern', 'serna', 'ernam', 'rname', 'userna', 'sernam', 'ername', 'usernam', 'sername', 'username']