无重复字符的子字符串

给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
(第一次发布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

猜你喜欢

转载自blog.csdn.net/qq_34116958/article/details/88963155