leetcode 无重复字符的最长子串

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

示例 1:

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

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

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

来源:力扣(LeetCode) 
链接:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters
 

思路分析:

1、遍历字符串,定义一个字典存储无重复字符以及字符在串s的下标位置。

2、定义最长子串的长度变量le,探索串s的起始指针start。

3、遇到字符在字典中:

    字符上次出现的位置在start后面或与start相等,start后移到上次出现位置的后一位;

    否则记录字符位置,start不动。

4、字符不在字典中,继续遍历,记录当前字符下标。

如:

a    b    c   a    b   c   b   b

i

strat

a    b    c   a    b   c   b   b

                  i

     start(le=i-start+1)

a    b    c   a    b   c   b   b

                             i

                   start

a    b    c   a    b   c   b   b

                                  i

                             start(le>i-start+1,不变)

def lengthOfLongestSubstring(self, s: str) -> int:
        if not s:
            return 0
        le,start=0,0
        dic={}
        for i in range(len(s)):
            val=s[i]
            if val in dic:
                if dic[val]+1>start:
                    start=dic[val]+1
                dic[val]=i
            else:
                dic[val]=i
            if i-start+1>le:
                le=i-start+1
        return le

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值