leetcode:[3]最长不含重复字符子串

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了leetcode:[3]最长不含重复字符子串相关的知识,希望对你有一定的参考价值。

  1. Input: "abcabcbb"
    Output: 3
    Explanation: The answer is "abc", with the length of 3.

  2. Input: "bbbbb"
    Output: 1
    Explanation: The answer is "b", with the length of 1.

  3. Input: "pwwkew"
    Output: 3
    Explanation: The answer is "wke", with the length of 3.
    Note that the answer must be a substring, "pwke" is a subsequence and not a substring.
class Solution:
    def lengthOfLongestSubstring(self, s):
        """
        遍历所有字符,通过更新每个字符出现的位置,并调整起点位置,计算得到当前子串的长度。
        :type s: str
        :rtype: int
        """
        # 这里我们只考虑ascii码表中的前256个字符,如果输入是超过这个范围的则需要扩大list长度
        # 或者使用字典
        char_pos = [-1] * 256
        # 将start标记为当前子串起点前1位。例如当前子串的下表是0-3,则start置为-1,这样在后面
        # 计算长度的时候就不用+1,因为start标记的是前一位
        start = -1
        maxlen = 0
        # 对每一个字符来说,如果上一次出现的下标比当前子串的起点要大,也就是说这个字符上一次出现
        # 的地方是在start之后,而这一次又出现了,说明在[start+1, i]这一段出现了2个相同字符。
        # 那么我们需要将start移动到当前字符上一次出现的位置才能确保当前字符的这一次出现是新子串
        # 中的第一次出现。
        # 对于每一个出现的字符,记录最新出现的下标。
        for i, c in enumerate(s):
            if char_pos[ord(c)] > start:
                start = char_pos[ord(c)]

            char_pos[ord(c)] = i
            maxlen = max(maxlen, i - start)

        return maxlen

以上是关于leetcode:[3]最长不含重复字符子串的主要内容,如果未能解决你的问题,请参考以下文章

[LeetCode]剑指 Offer 48. 最长不含重复字符的子字符串

LeetCode-滑动窗口最长不含重复字符的子字符串

LeetCode 3. 无重复字符的最长子串(动态规划,HashMap,Java)

LeetCode 3. 无重复字符的最长子串(动态规划,HashMap,Java)

最长不重复子串

剑指 Offer 48. 最长不含重复字符的子字符串