- 无重复字符的最长子串
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
示例 2:
输入: “bbbbb”
输出: 1
解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。
示例 3:
输入: “pwwkew”
输出: 3
解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。
请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。
通过次数591,279提交次数1,677,893
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/
from 字符串 import s
class Solution:
def lengthOfLongestSubstring(self, s):
#用字典保存字符在s中的下标(靠近指针j的那个)指针j为当前子串的末尾指针
#本字典主要用来更新子串的起始指针,防止子串出现重复字符
hash_set = {}
#保存当前找到的最长子串的长度
max_length = 0
#当前子串的起始指针
i = 0
#遍历一次s找到最长无重复子串
#j为当前所求子串的末尾指针
for j in range(len(s)):
#如果当前字符在前面出现过,那么看其在当前子串的起始指针前还是后或就是起始指针处,
# 若在前则无需更新i,否则i应当更新到该字符上次出现过的位置的后一个位置
if s[j] in hash_set:
if hash_set[s[j]] >= i:
i = hash_set[s[j]] + 1
#比较当前子串与目前所求最大字串长度的大小,取较大者更新当前所求最大子串长度
max_length = max(max_length, j-i+1)
#更新该字符在先前出现的位置,(若先前未出现的则补充,先前出现过的则更新)
hash_set[s[j]] = j
return max_length
sl = Solution()
r = sl.lengthOfLongestSubstring(s)
print(r)
字符串s的长度为31000
本题难点在于采用暴力解法直接求出s的全部子串再求出无重复子串最后求最大长度的话求解效率过低,运行时间太长通不过LeetCode测试,所以经过改进,我采用了另一种较巧妙地方法,即利用双指针滑动窗口,一次遍历实时更新最长无重复子串的长度,需要额外建立一个字典来保存先前出现的字符在s中的位置,以此来防止子串出现重复字符。具体思路代码注释中已写明。