《画解算法》3. 无重复字符的最长子串python3丨简单

Posted 不吃西红柿丶

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《画解算法》3. 无重复字符的最长子串python3丨简单相关的知识,希望对你有一定的参考价值。

🍅 作者主页:不吃西红柿 

🍅 简介:CSDN博客专家、C站总榜第8🏆、HDZ核心组成员。欢迎点赞、收藏、评论

 

给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。

示例 1:

输入: s = "abcabcbb"
输出: 3 
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:

输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:

输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
     请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
示例 4:

输入: s = ""
输出: 0
 

提示:

0 <= s.length <= 5 * 104
s 由英文字母、数字、符号和空格组成

方法一:暴力法
分别以每个字符为起始字符,逐个字符判断,直到在哈希表中发现重复字符

class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:
        ans = 0
        hash_set = set()

        for i in range(len(s)):
            cur_ans = 0
            for j in range(i, len(s)):
                if s[j] in hash_set:
                    hash_set.clear()
                    break
                else:
                    hash_set.add(s[j])
                    cur_ans += 1
            ans = max(ans, cur_ans)
        
        return ans

方法三:滑动窗口
对于数组或字符串类的子数组/子串问题,滑动窗口是一种常用的方法。
在每次循环中,右指针稳定右移,当遍历到重复字符时,左指针右移直到不再重复
以此作为窗口,从左向右逐步滑动即可

class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:
        ans = 0
        hash_set = set()

        left, right = 0, 0
        while right < len(s):
            while s[right] in hash_set:
                hash_set.remove(s[left])
                left += 1
            
            hash_set.add(s[right])
            ans = max(ans, right - left + 1)
            right += 1
        
        return ans

添加公众号「信息技术智库」:

🍅 硬核资料:20G,8大类资料,关注即可领取(PPT模板、简历模板、技术资料)
🍅 技术互助:技术群大佬指点迷津,你的问题可能不是问题,求资源在群里喊一声。
🍅 面试题库:由各个技术群小伙伴们共同投稿,热乎的大厂面试真题,持续更新中。
🍅 知识体系:含编程语言、算法、大数据生态圈组件(mysql、Hive、Spark、Flink)、数据仓库、前端等。

👇👇送书抽奖丨技术互助丨粉丝福利👇👇

以上是关于《画解算法》3. 无重复字符的最长子串python3丨简单的主要内容,如果未能解决你的问题,请参考以下文章

python经典算法题:无重复字符的最长子串

中级算法3. 无重复字符的最长子串

每日算法/刷穿 LeetCode3. 无重复字符的最长子串(中等)

leetcode 算法题3 无重复字符的最长子串

3. 无重复字符的最长子串(LeetCode力扣算法 - java / rust)

3. 无重复字符的最长子串(LeetCode力扣算法 - java / rust)