Longest Substring Without Repeating Characters [Python解]

题目要求Given astring, find the length of thelongestsubstring without repeating characters.

Examples:

Given"abcabcbb", the answer is "abc", which the length is 3.

Given"bbbbb", the answer is "b", with the length of 1.

Given"pwwkew",the answer is "wke", with thelength of 3. Note that the answer must be asubstring, "pwke" is a subsequence and not a substring.


题目说明:给定一个字符串,找出一个长度最长且包含的元素唯一的子字符串,返回值为此字符串的长度。

题目分析:找子字符串没什么难度,就是字符串中相邻元素即可,关键这里的子字符串有两个限定:1.包含元素不准有重复2.长度为所有子串中最长。盖之,就是以重复元素为截断点得到一个个子串,然后比较长度。

例子详解"abcabcbb"的子串根据不重复元素截断一共有6个,分别是["abc","bca","cab","abc","cb","b"]。截取并组成新子串依据:第一个子串"abc"在碰到"a"后判断其为重复元素,从"a"后开始截断"abc"得到"bc",再将"bc""a"组成一个新子串"bca",依次类推得到所有子串。


解题一:列表存储所有子串,最后比较长度

       这是我的解法,采用截断法获取所有子串后,比较获得长度,优点:可以明确指出到底哪个子串最长和其长度,并且容易理解;缺点:运行时间长

class Solution(object):
    def lengthOfLongestSubstring(self, s):
        """
        :type s: str
        :rtype: int
        """
        if len(s) == 0:
            return 0
        m = 0
        result = [s[m]]
        for i in range(1,len(s)):
            if s[i] in result[m]:       #如果碰到重复元素,从后面开始截取
                len_m = len(result[m])
                for j in range(len_m):
                    # print j,s[i],m
                    if s[i] == result[m][j]:    
                        result.append(result[m][j+1 : len_m])
                m += 1 
            #最后都得需要把不重复元素放入子字符串
            result[m] = result[m]+s[i]
        for mm in range(m+1):
            if len(result[mm]) > len(result[0]):
                result[0] = result[mm]
        return len(result[0])

解题二:字典存储不重复元素下标,及时得到每个子串的长度
这是leetcode上一个码友的解题方法,思路都是及时截断得到新子串,但他的方法妙在可以开辟少量空间计算并且实时得到最长的子串长度,代码少而精,只用了85ms, 其缺点是: 理解需要点时间。

class Solution:
    # @return an integer
    def lengthOfLongestSubstring(self, s):
        start = maxLength = 0
        usedChar = {}
        
        for i in range(len(s)):
            if s[i] in usedChar and start <= usedChar[s[i]]:
                start = usedChar[s[i]] + 1
            else:
                maxLength = max(maxLength, i - start + 1)

            usedChar[s[i]] = i

        return maxLength


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值