剑指offer

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

2020-03-26  本文已影响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)
上一篇下一篇

猜你喜欢

热点阅读