给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例 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