LeetCode千题斩之3:Longest Substring Without Repeating Characters(最长不重复子串)

题目:Given a string, find the length of the longest substring without repeating characters.

先说说思路,优化的方法在于用一个滑动的窗口[i,j]浏览字符串,先把遇到的字符加入一个字典dic,字符为key,value为最近更新的位置。如果是s[j]存在于是现有的窗口是s[j′]中,则可以跳过i到j′的字符串。细节注释见代码。 

#!/usr/bin/env python
# encoding: utf-8
'''
@author: cc
'''
def lengthOfLongestSubstring(s):
    """
    :type s: str
    :rtype: int
    """
    dic={}  #key为字符,value为最近更新的位置,存放已经遇到过的字符
    i=0
    j=0  # i,j之间的字符串是现在浏览的未重复的子串
    maxlen=0
    for j in range(len(s)):
        if s[j] in dic.keys():
            i=max(i,dic[s[j]])      #一、新遇到的字符在现在i,j之间的字符串中,;二、未在i,j之中,但在i之前遇到的
        dic[s[j]]=j+1  #把遇到的字符放入字典中,存在则更新位置
                        #加一是因为若新遇到的字符在现在i,j之间的字符串中,则需要更新为之前位置加一;而第二种情况则保持i不变
        maxlen=max(maxlen,j-i+1)
    return maxlen

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值