LeetCode3-无重复字符的最长子串(的长度)
题目:
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
提示:
0 <= s.length <= 5 * 104
s 由英文字母、数字、符号和空格组成
思路:
寻找出两个相同字符之间的位置,位置距离最大的就是最长无重复子串
j 表示子串终止位置,i表示字串起始位置 当未出现重复时,字符串的长度即为字符串的结束位置减去起始位置。发生重复时,重新利用字符串的结束位置j减去新的起始位置i,并与之前的未重复字串的长度作比较取较大者
答案:
class Solution(object):
def lengthOfLongestSubstring(self, s):
"""
:type s: str
:rtype: int
"""
# 定义字典用于记录字符出现的位置,即字典的value
st = {}
# i代表子串起始位置,设置为-1是因为个数是终止位置-(起始位置-1) ans代表所求最长子串
i, ans = -1, 0
# 设置遍历次数,j代表子串的终止位置 ,通过索引范围(切片)是[i, j]返回子串的元素
for j in range(len(s)):
# 字典中存在,之前出现过,即判断相同元素上次出现的位置(in字典默认是判断是键,如果要判断值可以用 字典.values())
if s[j] in st:
# 记录新的子串位置,即重复字符的位置如果在原起始位置前面,则新起始位置不用动;如果在原起始位置的后面,则用重复字符的位置去更新起始位置
i = max(st[s[j]], i)
# 获取最大子串长度
ans = max(ans, j - i)
# 更新子串的结束位置
st[s[j]] = j
return ans
浙公网安备 33010602011771号