leetcode算法题(3)--不含重复字符的最长子串长度-Longest Substring Without Repeating Characters

整理自己对一些leetcode算法题的想法和实现,一直努力,每天都有新提高
–来自一个热爱编程的程序媛

1.LeetCode地址:

Longest Substring Without Repeating Characters

2.难度:medium

3.题目:

Given a string, find the length of the longest substring without repeating characters.
例子

4.思路

1.字典

想找到最长的子串长度,至少需要记录下已经访问过的字符。如果新来的字符已经在字典中,那么需要把前面的字符去掉,新的加进来,同时计算最大长度。

2.双指针

需要记录下当前探查到的字符位置,也需要记录下当前字典中字符的起始位置,所以要用双指针。

3.图示

i记录左边的位置,j记录右边的位置。max_length返回最大长度。
黄色标志当前的最长子串。绿色表示下一步要探查的j的位置。
图示中,每次删除都是删除i的位置字符,不够快。后面第二种代码有改进。图示

5.代码

1.图示思路代码

class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:
        dict_ss ={}
        if len(s) ==0:
            return 0
        maxLen = 0
        i =0
        j=0
        #区间  i  --  j
        while i <len(s) and j<len(s):
            if s[j] not in dict_ss:
                dict_ss[s[j]] = j
                j +=1
                maxLen = max(maxLen,j-i)
            else :
            #每次删除i位置字符,这里可以改进
                del dict_ss[s[i]]
                i +=1 
        return maxLen 

2.改进代码

#Runtime: 52 ms, faster than 98.14% of Python3 online submissions for Longest Substring Without Repeating Characters.
#Memory Usage: 13.4 MB, less than 30.93% of Python3 online submissions for Longest Substring Without Repeating Characters.
class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:
        begin_pos =0
        dict_curr={}
        max_length = 0
        curr_length =0
        for i,alpha in enumerate(s):
            if alpha in dict_curr:
            ##不从字典中删除已有字符,只更新位置。每次更新起点为存在字符的下一个位置和上次起点的最大值
                begin_pos = max(dict_curr[alpha]+1,begin_pos)
                dict_curr[alpha] =i
                max_length = max(max_length,curr_length)
                curr_length = i-begin_pos +1
            else:
                dict_curr[alpha] =i
                curr_length +=1
        max_length = max(max_length,curr_length)
        return max_length
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值