[Leetcode]Longest Substring Without Repeating Characters

46 篇文章 0 订阅

Given a string, find the length of the longest substring without repeating characters. For example, the longest substring without repeating letters for "abcabcbb" is "abc", which the length is 3. For "bbbbb" the longest substring is "b", with the length of 1.

求没有重复字符的最长字符串~维护两个指针start, end;保证两个指针间没有重复元素,用hashmap判断是否有重复元素,如果end指针遇到了重复元素,把start指针往后移到第一个和end指针相同的字符之后(注意移动时要记得把start指针原来所在的位置及移动后的位置之间的元素从dictionary中删除掉)~代码如下,时间复杂度为O(n)

class Solution:
    # @return an integer
    def lengthOfLongestSubstring(self, s):
        if s is None or len(s) == 0: return 0
        res = 0; dict = {}
        start, end = 0, 0
        while end < len(s):
            if s[end] in dict:
                tmp = dict[s[end]]
                for i in xrange(start, dict[s[end]] + 1):
                    del dict[s[i]]
                start = tmp + 1
            else:
                res = max(res, end - start + 1)
                dict[s[end]] = end
                end += 1
        return res

代码还可以再简洁一点~下面的代码就省去了从dict中删除前面重复元素之前的元素的步骤,所以效率也就更高~~Runtime 也从150ms左右降低到90ms~

class Solution:
    # @return an integer
    def lengthOfLongestSubstring(self, s):
        if s is None or len(s) == 0: return 0
        dict = {}; start = 0; maxLen = 0
        for end in xrange(len(s)):
            if s[end] in dict and dict[s[end]] >= start:
                start = dict[s[end]] + 1
            dict[s[end]] = end
            maxLen = max(maxLen, end - start + 1)
        return maxLen


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值