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

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

方法:动态规划  时间复杂度O(n)  空间复杂度O(n) 

本题可以采用动态规划,记录以当前末尾字符为结尾的最长不重复子字符串长度

需要使用一个哈希表来记录某一字符上一次出现的index  dic[s[ i ]] = i

对于新进字符,如果没出现过,则dp[i] = dp[i-1] + 1,如果出现过,但在 i - dic[s[i]] > dp[i-1],说明出现在dp[i-1]的范围外,同样 dp[i] = dp[i-1] + 1,否则dp[i] = i - dic[s[i]]

 

class Solution(object):
    def lengthOfLongestSubstring(self, s):
        """
        :type s: str
        :rtype: int
        """
        dic = {}
        res = tmp = 0
        for i in range(len(s)):
            if s[i] in dic:
                tmp = tmp + 1 if i - dic[s[i]] > tmp else i - dic[s[i]]
            else:
                tmp += 1
            dic[s[i]] = i
            res = max(res,tmp)
        return res

 

posted @ 2022-08-06 14:09  Liang-ml  阅读(20)  评论(0)    收藏  举报