突破%

 

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

posted on 2022-04-04 00:04  突破%  阅读(18)  评论(0)    收藏  举报

导航