[Leetcode][python]Longest Substring Without Repeating Characters/无重复字符的最长子串

题目大意

给定一个字符串,从中找出不含重复字符的最长子串的长度。
例如,”abcabcbb”的不含重复字母的最长子串为”abc”,其长度是3。”bbbbb”的最长子串是”b”,长度为1。

解题思路

哈希表+双指针

来自博客

变量start和end分别记录子串的起点和终点,从左向右逐字符遍历原始字符串,每次将end + 1,字典countDict存储当前子串中各字符的个数
当新增字符c的计数 > 1时,表明已经有重复,向右移动起点start,并将s[start]在字典中的计数 - 1,直到countDict[c]不大于1为止更新最大长度

代码

class Solution(object):
    def lengthOfLongestSubstring(self, s):
        """ :type s: str :rtype: int """
        ans, start, end = 0, 0, 0
        countDict = {}
        for c in s:
            end += 1
            countDict[c] = countDict.get(c, 0) + 1  # countDict.get(c, 0)意思是:若c不存在直接返回0
            while countDict[c] > 1:
                countDict[s[start]] -= 1
                start += 1
            ans = max(ans, end - start)
        return ans

优化思路:遇到重复的字母,直接跳到重复字母的后面一个,而不是像之前那样慢慢向右移动!

class Solution(object):
    def lengthOfLongestSubstring(self, s):
        """ :type s: str :rtype: int """
        used = {}
        max_length = start = 0
        for i, c in enumerate(s):
            if c in used and start <= used[c]:
                start = used[c] + 1
            else:
                max_length = max(max_length, i - start + 1)

            used[c] = i

        return max_length

总结

  • countDict.get(c, 0)
全部评论

相关推荐

搜索部&nbsp;首先说下timeline8.18,投递8.19,约一面8.21,晚上一面call约二面8.22,上午二面下午oc周末等待(8.23,8.24)8.25,offer一年前,我还是懵懵懂懂,高考完的暑假,只会提前学学高数,未来的画像是什么?我或许无法预测。开学后,自学Python,接单,无数个客户的ddl,偷偷摸摸一个人找自习的地方,这一步步竟然为后来的我,搭建工程能力的基础。大一上,我也要感谢我的第一位老板,让我接触到了实习,师兄带着我一步步入门,看他们写的飞书文档。大一下,导师带我参与企业项目,这让我渐渐发现,应该去实践,增长见识,而非局限当下,盯着自己的小新pro。不久后,第一波投递开始,结果当然是约面极少。盯着简历上的文字和ssob,我开始思考,确实很多可以去提升。带着些许不甘心,继续沉淀,慢慢的约面也越来越多,有的时候两天7场,准备完就接着下一个日程。这一次,也许是刚好到位吧,比较match,面试答的流利,关关难关关过,成为度孝子展望未来,依然是重重挑战,果然只有收到offer的那一刻是开心的。愿在百度星海拆解的每一段代码,都能成为丈量宇宙的诗行;此志终赴星河,而今迈步重铸天阶。屏幕前的你们,在无数个向星海奔赴的日夜,一定一定,会在未来化作群星回响的征程——请永远相信此刻埋首耕耘的自己!!!
一天三顿半:???百度提前批发 offer了?不是统一和正式批排序完再发吗我靠
百度求职进展汇总
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务