🍅 作者主页:不吃西红柿
🍅 简介: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 = 0hash_set = set()for i in range(len(s)):cur_ans = 0for j in range(i, len(s)):if s[j] in hash_set:hash_set.clear()breakelse:hash_set.add(s[j])cur_ans += 1ans = max(ans, cur_ans)return ans
方法三:滑动窗口
对于数组或字符串类的子数组/子串问题,滑动窗口是一种常用的方法。
在每次循环中,右指针稳定右移,当遍历到重复字符时,左指针右移直到不再重复
以此作为窗口,从左向右逐步滑动即可
class Solution:def lengthOfLongestSubstring(self, s: str) -> int:ans = 0hash_set = set()left, right = 0, 0while right < len(s):while s[right] in hash_set:hash_set.remove(s[left])left += 1hash_set.add(s[right])ans = max(ans, right - left + 1)right += 1return ans
添加公众号「信息技术智库」:
🍅 硬核资料:20G,8大类资料,关注即可领取(PPT模板、简历模板、技术资料)
🍅 技术互助:技术群大佬指点迷津,你的问题可能不是问题,求资源在群里喊一声。
🍅 面试题库:由各个技术群小伙伴们共同投稿,热乎的大厂面试真题,持续更新中。
🍅 知识体系:含编程语言、算法、大数据生态圈组件(Mysql、Hive、Spark、Flink)、数据仓库、前端等。
👇👇送书抽奖丨技术互助丨粉丝福利👇👇