https://leetcode-cn.com/explore/interview/card/bytedance/242/string/1012/
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
思路:
遍历一次字符串,不停更新最大长度即可。在实现中用start变量记录从哪里开始记录不重复字符串的首位置。用str_dict记录每个字符出现的位置
遍历过程中,分为2种情况:
- 遍历到的字符串没有重复,或者字符串重复的位置比start小(当做没有重复处理),此时记录/更新 str_dict,如果超过最大长度,更新最大长度
- 遍历的字符已存在且位置比start大,此时先更新最大长度(注意不要+1),在更新start位置和str_dict。
class Solution(object):
def lengthOfLongestSubstring(self, s):
"""
:type s: str
:rtype: int
"""
if not s:
return 0
start = 0
longest = 0
str_dict = {}
for i in range(0,len(s)):
if s[i] not in str_dict or str_dict[s[i]]<start:
str_dict[s[i]] = i
if i - start + 1 > longest:
longest = i - start +1
else:
if i - start > longest:
longest = i - start
start = str_dict[s[i]] + 1
str_dict[s[i]] = i
return longest
网友评论