[leetcode]|[leetcode] 3.无重复字符的最长字串
难度:Medium.
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
【[leetcode]|[leetcode] 3.无重复字符的最长字串】示例 2:
输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:解析:
输入: "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
这里的相关标签是:
哈希表,字符串,双指针,sliding windows
.怎么理解?
首先,根据前两道题可以发现,这种寻找索引的题目,都会用到哈希表。其中,哈希表的key为数组的值,value则是索引。基本的思路是维持一个滑动窗,且窗内无重复字符,我们要做的是尽可能大的扩大窗口的大小。
以''为例:
左指针
left
是该字符上次出现的位置;右指针
right
则是该字符此次出现的位置。字串的长度为
right - left
,最长字串的长度为max_len
。那么,当
right - left > max_len
时,更新max_len = right - left
。为了遍历每个 字符,需要
for
循环:for right in range(len(s)):
对于输入字符串有2种情况:
- 'a', 'b', ' ', 这种单字符的字符串,
left
这指针起始为,right
为当前字符索引。
- 'abba', 这种含有重复字符的字符串,
left
需要不断比较更新, 当新的字符与过去出现的字符重复,left
为重复字符的上代索引.
>
比如这个例子中运行到''时,left = -1
,right
为当前字符索引,max_len = 2
。
>
当运行到''时,left = 1
,right
为当前字符索引,max_len = 2
。
但是这里其实包含一个小陷阱。
>
当运行到''时,left = 0
,right
为当前字符索引,则max_len = 3
。
这是因为left
在往前跳的时候,包含了重复的''。那么怎么解决这个问题呢?
就是在新的寻找left
的值时多一层判断,即当运行到''时,上代 的索引为0 上代left = 1
,这时不更新left
。
class Solution(object):
def lengthOfLongestSubstring(self, s):
"""
:type s: str
:rtype: int
"""
max_len = 0
left = -1
d = {}for right in range(len(s)):
if s[right] in d and d[s[right]] > left:
left= d[s[right]]d[s[right]] = rightif (right - left) > max_len:
max_lin = right - leftreturn max_len
推荐阅读
- 学无止境,人生还很长
- jhipster|jhipster 升级无效问题
- 说的真好
- 解决SpringBoot引用别的模块无法注入的问题
- 【Leetcode/Python】001-Two|【Leetcode/Python】001-Two Sum
- leetcode|leetcode 92. 反转链表 II
- 抱着梦的无眠
- 松软可口易消化,无需烤箱超简单,新手麻麻也能轻松成功~
- 公园游
- 2018-07-27读书心得