尝试查找最长子字符串的长度时遇到问题

Trouble trying to find length of longest substring

我写了下面的代码。它应该 return 对我来说是字符串中最长下标的长度,没有字母重复。

def lengthOfLongestSubstring(s):
    lst = []
    y = 0
    final = 0
    count = len(s)      
    while len(s) > 0:
        s = s[y:]            
        for i in range(len(s)):
            if s[i] in lst:
                y += 1
                count = len(lst)
                lst =[]
                break
            else:
                lst.append(s[i])

        if count > final:
            final=count 
    return(final)

当输入字符串“tmmzuxt”时,我希望得到 5 的输出(“mzuxt”的长度),但却得到 4。我已经调试找出问题似乎是我的函数跳过了第二个'm' 索引时,但我不明白为什么。有什么建议吗?

意识到我不知何故错过了一行。希望这更有意义。

我不确定我是否理解你的代码,或者实际上这里是否需要 while 循环。试试这个:

def lengthOfLongestSubstring(s):
    max_length = 0
    length = 0
    previous = ''
    for thisCharacter in s:
        if thisCharacter != previous:
            length += 1
        else:
            max_length = max(length, max_length)
            length = 1
    return max_length

这是经过编辑的代码。删除#lst =[] 和#break 行。

[代码]

def lengthOfLongestSubstring(s):
    lst = []
    y = 0
    final = 0
    count = len(s)      
    while len(s) > 0:
        s = s[y:]            
        for i in range(len(s)):
            if s[i] in lst:
                y += 1
                count = len(lst)
                #lst =[]
                #break
            else:
                lst.append(s[i])

        if count > final:
            final=count 
    return(final)

s="tmmzuxt"
print(lengthOfLongestSubstring(s))

[输出]

5

您的代码的主要问题是您增加了 y,即使它应该只删除第一个字符。不需要变量 y。试试这个:

def lengthOfLongestSubstring(s):
    final = 0
    while len(s) > 0:
        count = len(s)
        lst = []
        for i in range(len(s)):
            if s[i] in lst:
                count = i - 1
                break
            lst.append(s[i])
        if count > final:
            final = count
        s = s[1:]
    return final

print(lengthOfLongestSubstring("tmmzuxt"))

你的问题是你在修改 s 而你是 运行 你的代码。 考虑到在第一次迭代中,您得到 s = s[0:],因此 s 现在将是 'tmmzuxt'。在您的下一次迭代中,您将从修改后的 s 中获得 s = s[1:]。这仍然不是问题,因为你刚好得到 'mmzuxt'。但是,在您的第三次迭代中,您得到 s = s[2:],现在是 'zuxt'。 所以你需要一个不同于 s 的变量来保存你实际测试的 s 的子字符串。

这里,在您的代码(第 7 行)中,每次您的 for 循环迭代时,您都在函数内部更新字符串值。 例如,在 for 循环内的每个 break 之后。你的字符串(就是“tmmzuxt”)越来越短了。

我创建了一个包含您的原始字符串的新变量。

def lengthOfLongestSubstring(s):
    lst = []
    y = 0
    final = 0
    count = len(s)
    main_string = s;#change done here
    while len(s) > 0:
        
        s = main_string[y:] #change done here
        for i in range(len(s)):
            if s[i] in lst:
                y += 1
                count = len(lst)
                lst =[]
                break
            else:
                lst.append(s[i])
            
        if count > final: 
            final =count
            print(final)
    return(final)

lengthOfLongestSubstring("tmmzuxt")