好吃的小笼包 发表于 2020-11-23 11:33:55

无重复字符的最长子串

给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
输入: "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
ps:leetcode中的第三题,代码是评论中的第一个给出的

class Solution(object):
    def lengthOfLongestSubstring(self, s):
      """
      :type s: str
      :rtype: int
      """
      st = {}
      i, ans = 0, 0
      for j in range(len(s)):
            if s in st:
                i = max(st], i)
            ans = max(ans, j - i + 1)
            st] = j + 1
      return ans

a = Solution()
s = 'abcabcbb'
print(a.lengthOfLongestSubstring(s))

没看明白i = max(st], i)这一行,第一次进入循环j=0,那么s=a,那max(st,i)是什么鬼

西瓜味的苹果 发表于 2020-11-23 11:37:37

就是max(a,b),取a,b当中最大值

jtxs0000 发表于 2020-11-23 12:32:47

第一次j=0 那么if 条件不成立,里面的缩进不会执行,直接跳到ans那一行

当j=3的时候 if 条件才会成立,那个时候st作为字典里面就有数据了

i = max(st], i)表示为: i = max(st, i)再次分解为: i = max(1,0)

应该是这样,看的有点乱,有可能会错,建议你debug

好吃的小笼包 发表于 2020-11-23 15:46:30

jtxs0000 发表于 2020-11-23 12:32
第一次j=0 那么if 条件不成立,里面的缩进不会执行,直接跳到ans那一行

当j=3的时候 if 条件才会成立, ...

我就是不太明白st为啥是1

jtxs0000 发表于 2020-11-23 16:57:36

好吃的小笼包 发表于 2020-11-23 15:46
我就是不太明白st为啥是1

st在上面已经定义为字典了,然后在for 的时候 a 被定义为key

然后 st]的意思是 st0]分解开来就是st ,又因为j = 0

所以return 上面那句st] = j + 1   就是 st = 0 + 1

弄成字典的话就变成了st = {"a":1}

然后取值 st["a"] = 1 或者是st] = 1(里面的3就是for循环里面的j,可以变化的)
页: [1]
查看完整版本: 无重复字符的最长子串