【leetCode】无重复字符的最长子串 问题详解

题目

leetCode地址: 无重复字符的最长子串

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

示例 1:

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

示例 2:

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

示例 3:

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

解答

class Solution:
    def lengthOfLongestSubstring(self, s):
        """
        :type s: str
        :rtype: int
        """
        stringMap ={}
        longestLength,start =0,0
        for index,char in enumerate(s):
            start = max(start,stringMap.get(char,-1) +1)
            longestLength = max(longestLength,index-start+1)
            stringMap[char]=index
        return longestLength

复制代码

该题主要考察了hashMap数据结构 的应用

变量含义

  • stringMap:字符char作为键,字符在字符串中最新出现的下标index作为值
  • longestLength:子串最长长度,初始为0
  • start:当前子串开始的下标,初始为0

代码解析

  1. start = max(start,stringMap.get(char,-1) +1):确定子字符串开始的位置。首先,判断该字符在map中是否出现过,出现过的话,再进一步判断该字符是否在在当前子字符串中(通过判断其下标是否比start大)如果比start大,,代表当前的char在当前子字符串中出现过,这时需要 将子字符串中出现该char的下标+1,并把该下标设为新子字符串开始的下标start,以保持子字符串中不会出现重复字符;如果没有出现过,start保持不变

  2. longestLength = max(longestLength,index-start+1):接下来判断当前的子字符串最长长度longestLength`是否有变化。什么情况才会有变化呢?当前子字符串的长度大于之前记录的最长程度时。

  3. stringMap[char]=index: 最后更新当前字符char最新出现的下标index。这一步非常关键,只有及时更新其下标,才能确保该字符的下标是字符串中最新出现的下标

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值