给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
(第一次发布CSDN博客,还有许多要学习的地方,不好之处,还望指正。)
示例 1:
输入: “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
示例 2:
输入: “bbbbb”
输出: 1
解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。
示例 3:
输入: “pwwkew”
输出: 3
解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。
请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。
基本思想:
采用滑动窗口,窗口从第一个字符串逐渐扩大,每扩大时发现即将包含的字符已存在该窗口中,便把已存在的字符删去,从该字符的下一个索引值处开始计算子字符串的大小,寻找每个的窗口的最大值。如:'abcdacbde’窗口从最开始扩大,当到第二个a处时 ,已经有a存在,便舍弃第一个a从第一个a的下一个索引值处开始开始计算子字符串大小,并与之前的子字符串比较长度,选取大的子字符串长度。
python实现:
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
#ans,i分别为子字符串长度,和出现重复字符的下一个索引值
ans, i = 0, 0
#s_dic为每个字符与索引值形成的字典
s_dic = {}
#j为窗口长度
for j in range(len(s)):
#若滑动窗口扩大时,下一个字符已存在字典中,i便定位到已存在字符的下一个索引值处
if s[j] in s_dic:
i = max(s_dic[s[j]] + 1, i)
s_dic[s[j]] = j
#寻找最大长度的子字符串
ans = max(ans, j - i + 1)
return ans