[python]Leetcode3-Longest Substring Without Repeating Characters

Description:
Given a string, find the length of the longest substring without repeating characters.
Example1:
Input: “abcabcbb”
Output: 3
Explanation: The answer is “abc”, with the length of 3.
Example2:
Input: “bbbbb”
Output: 1
Explanation: The answer is “b”, with the length of 1.
Example3:
Input: “pwwkew”
Output: 3
Explanation: The answer is “wke”, with the length of 3.
Note that the answer must be a substring, “pwke” is a subsequence and not a substring.


思路: 两个指针一前一后遍历,复杂度高。

class Solution(object):
    def lengthOfLongestSubstring(self, s):
        if not s:
            return 0
        i,j=0,1
        result=[]
        while j<len(s):
            if s[j] not in s[i:j]:
                j+=1
            else:
                result.append(j-i)
                i+=1
                j=i+1
        result.append(j-i) #到末尾时添加
        return max(result)

思路: 利用滑动窗口。在遍历过程中,若遇到已经出现过的字符,则进行窗口滑动,期间用dict记录出现过的字符。注意滑动后需要在dict中删除已不在窗口中的首元素。

class Solution:
    def lengthOfLongestSubstring(self, s):
        if not s:
            return 0
        dic={}
        ans,i,j=0,0,0
        l=len(s)
        while i<l and j<l:
            if s[j] not in dic:
                dic[s[j]]=j
                j+=1
                ans=max(ans,j-i)
            else:
                dic.pop(s[i])
                i+=1
        return ans

思路: 以上过程的优化,用index作dict中的value。

class Solution:
    def lengthOfLongestSubstring(self, s):
        if not s:
            return 0
        dic={}
        ans,i,j=0,0,0
        l=len(s)
        while j<l:
            if s[j] in dic:
                i=max(dic[s[j]],i) #如果元素已经出现过,则直接滑动到该元素的位置
                ans=max(ans,j-i)
            ans=max(ans,j-i+1)
            dic[s[j]]=j+1
            j+=1
        return ans
        
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值