无重复字符的最长子串

题目描述

给定一个字符串,找出不含有重复字符的最长子串的长度。

示例

输入: "abcabcbb"             
输出: 3 
解释: 无重复字符的最长子串是"abc",其长度为 3。
输入: "bbbbb"
输出: 1
解释: 无重复字符的最长子串是"b",其长度为 1。
输入: "pwwkew"
输出: 3
解释: 无重复字符的最长子串是"wke",其长度为 3。
     请注意,答案必须是一个子串,"pwke" 是一个子序列 而不是子串。

代码实现

class Solution:
    def lengthOfLongestSubstring(self, s):
        """
        :type s: str
        :rtype: int
        """
        l, start, n = 0, 0, len(s)
        maps = {}
        for i in range(n):
            start = max(start, maps.get(s[i], -1)+1)
            l = max(l, i - start+1)
            maps[s[i]] = i
        return l

思路

使用hashmap,将每一个已经阅读过的字符作为键,所对应的值为其在原字符串中的位置。

遍历字符串中每一个字符,如果它没在hashmap中,就加入到hashmap;当遍历到的某个字符在hashmap中出现过,证明有重复的字符,此时maps.get(s[i],-1)大于等于start,需要重新设置最长子串的长度跟最长子串的开始位置(maps.get(s[i])的下一个位置开始,即它加1的位置)。当字符不出现在hashmap中时,这个maps.get(s[i],-1)永远只会返回-1,-1+1=0<start的。

 

注:dict.get(key, default=None) :

  • key -- 字典中要查找的键。
  • default -- 如果指定键的值不存在时,返回该默认值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值