美文网首页剑指offer
面试题48. 最长不含重复字符的子字符串

面试题48. 最长不含重复字符的子字符串

作者: 人一己千 | 来源:发表于2020-03-26 06:03 被阅读0次

    题目

    请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。

    示例 1:

    输入: "abcabcbb"
    输出: 3 
    解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
    

    示例 2:

    输入: "bbbbb"
    输出: 1
    解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
    

    示例 3:

    输入: "pwwkew"
    输出: 3
    解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
         请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
    

    提示:

    s.length <= 40000
    注意:本题与主站 3 题相同:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/zui-chang-bu-han-zhong-fu-zi-fu-de-zi-zi-fu-chuan-lcof
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    思路

    首先想到的直接扫描过去,在每个字符从后往前找到相同的字符,算一个长度。很显然这样的算法复杂度是O(N^2)

    并且这个思路有问题,没有考虑这两个字符之间还夹着相同字符的可能!

    稍加改进,把算出来的长度和之前的比一下,以防前面的两个相同卡在这个字符串里,另外,为了迅速找到对应的字符在前面出现的位置,建立一个哈希表。

    可以问清楚是否只有26个字符,是的话可以直接用list作为表。

    代码

    class Solution:
        def lengthOfLongestSubstring(self, s: str) -> int:
            if len(s)<=1:return len(s)
            position = {}
            dp = [1]*len(s)
            position[s[0]] = 0
            for i in range(1,len(s)):
                char = s[i]
                index = position[char] if char in position else -1
                if index == -1 or i-index > dp[i-1]: dp[i] = dp[i-1] + 1
                elif i - index  <= dp[i-1]: dp[i] = i - index
                # 更新最新位置
                position[char] = i
            return max(dp)
    

    相关文章

      网友评论

        本文标题:面试题48. 最长不含重复字符的子字符串

        本文链接:https://www.haomeiwen.com/subject/rcfquhtx.html