【问题标题】:How do I check the whole string between duplicates?如何检查重复项之间的整个字符串?
【发布时间】:2020-12-02 18:32:47
【问题描述】:

Leetcode #3 最长不重复字符的子串

问题: 给定一个字符串,找出最长不重复字符的子串的长度。

我的代码:

def len_of_substring(s): 
    list_int = []
    st = ''

    for n in range(0, len(s)): 
        if s[n] not in st:
            st=st+str(s[n])
            list_int.append(len(st))
        else: 
            #list_int.append(len(st))
            st=s[n]
    return(max(list_int))

len_of_substring('dvdf')

'vdf' 的代码应该返回 3,但我的代码只返回 2。任何帮助将不胜感激!

【问题讨论】:

  • 请提供预期的minimal, reproducible example。显示中间结果与您的预期不同的地方。您的代码在实现中似乎适当地最小化,但鉴于无用的变量名称以及迄今为止缺乏调试,我不知道有多少人会做这些工作来对您的逻辑进行逆向工程。插入一些print 语句来跟踪执行和数据流;告诉我们逻辑哪里出错了。
  • 会不会是因为你测试的不是vdf,而是dvdf
  • @GAEfan 即使在测试“dvdf”时也应该返回 3
  • 是的,我正在阅读您的代码,而不是原始任务。您的代码只计入重复字符。

标签: python string list duplicates


【解决方案1】:

您永远不会将找到的最后一个子字符串附加到list_int。您可以在 for 循环之后解决该问题,包括以下内容:

if st:
    list_int.append(len(st))

此外,st=s[n] 行也不完全正确。考虑输入dvdf。当你穿过它时,st 将从'' 变为'd''dv',最后我们会发现s[2] == 'd' 已经在st 中。我们应该尝试从v 重新开始,最终找到vdf,但我们只是从当前字符开始。一种(昂贵的)解决方法是在 else 块中找到重复的 last 外观的位置并从那里开始工作。即,代替st=s[n] 执行以下操作:

i = -1  # doesn't really matter
for j, c in enumerate(st):
    if c==s[n]:
        i = j
st = st[i+1:] + s[n]

把它们放在一起,你会得到这样的东西:

def len_of_substring(s): 
    list_int = []
    st = ''

    for n in range(0, len(s)): 
        if s[n] not in st:
            st=st+str(s[n])
            list_int.append(len(st))
        else:
            st = st[st.rfind(s[n])+1:] + s[n]
    if st:
        list_int.append(len(st))
    return(max(list_int))

一旦你得到它的工作,还有一些其他的性能和风格问题。您可能希望将完成的代码发布到code review stackexchange

【讨论】:

    猜你喜欢
    • 2017-07-07
    • 2020-05-28
    • 1970-01-01
    • 2011-03-23
    • 2015-10-09
    • 1970-01-01
    • 2019-08-29
    • 2015-05-08
    相关资源
    最近更新 更多