LeetCode刷题之“无重复字符的最长子串“的python解法之一

  1. 无重复字符的最长子串
    给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。

示例 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中的位置,以此来防止子串出现重复字符。具体思路代码注释中已写明。

©️2020 CSDN 皮肤主题: 黑客帝国 设计师:上身试试 返回首页