leecode 之 无重复字符的最长子串

给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。

示例 1:

输入: "abcabcbb"
输出: 3 
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:

输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:

输入: "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
     请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

 

class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:
        max_str, max_len = '', 0
        if not s:
            return 0
        for _s in s:
            if _s not in max_str:
                max_str += _s
            else:
                max_len = max(len(max_str), max_len)
                old_index = max_str.index(_s)
                max_str = max_str[old_index+1:] + _s
        max_len = max(len(max_str), max_len)
        return max_len

 

自己写的, 感觉这个问题比较简单,第一次见的时候比较蒙,完全是无从下手,但仍然坚持把它做出来,也算今天的一个进步。

思路:

1、直接pass掉多个for循环;

2、当时考虑了下双指针,感觉用处不大,for循环通过 enumerate 可以直接遍历出下标,该题也用不到, 我这里是保存了最大字符串max_str, 通过对比max_str 和之前记录的最大字符串的长度max_len,返回最大字符串的长度;

3、看了下时间最快的代码, 他的代码块中,通过字典,记录每个字符的索引位置,于是对原有的代码修改了一下, 见下图。

4、通过两个代码的比较,发现图1的执行效率略低一点,但内存使用较小, 图2的效率略高一点,但内存使用较高。  虽然不能上升到复杂度的层面, 但也对比出,字符串的index()方法,同样也属于遍历,会消耗一定的时间,不如字典的key-value形式的直接存储。

总结:以少量的空间,换取时间上的提升,还是一种性价比比较高的一种方法~ 

class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:
        max_str, max_len, str_dict = '', 0, dict()
        if not s:
            return 0
        for index, _s in enumerate(s):
            if _s not in max_str:
                max_str += _s
            else:
                max_len = max(len(max_str), max_len)
                max_str = s[str_dict[_s]+1:index] + _s
            str_dict[_s] = index
        max_len = max(len(max_str), max_len)
        return max_len

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值