LeetCoe-03-无重复字符的最长字串
LeetCode链接:LeetCoe-03-无重复字符的最长字串
题目理解及描述
- 无重复字符的最长子串难度中等3747给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。示例 1:输入: “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
示例 2:输入: “bbbbb”
输出: 1
解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。
示例 3:输入: “pwwkew”
输出: 3
解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。
请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。
思路:
- 暴力方法: 时间: O(N**2) 空间: O(N)
seq_lengths = []
for i, token in enumerate(s):
# 遍历每个字符
for j in range(i:len(s):
# 对于每个开始字符计算其下一次重复或者不重复的最长字串
j += 1
seq_len = j - i
if s[i] == s[j]:
break
seq_lengths.aapend(seq_len)
return max(seq_lengths)
4. 进一步优化: 内部第二个循环每次从当前位置向后寻找最长无重复字符串, 可以使用 hasMap{}来存储每个字符在字符串中的位置,如果遇到重复就进行更新;
思想: 一般方法都是从当前字符往后找,然后找到一个重复的字符停止; 可使用双指针的思路: 左指针指向当前字符, 右指针指向往后找的指针;
自己还没有真正理解清楚这道题; 如果暴力做: 1.当前字符 2. 向后查找 3.判断重复;
class Solution():
# 方法1:
def lengthOfLongestSubstring(self, s:str):
hasMap = {}
res = 0 # result
p = -1 # 哑节点 记录计算当前最长字符串的起始位置
for i, token in enumerate(s):
if token in hasMap and hasMap[token] > p:
p = hasMap[token] # 起始位置进行更新
hasMap[token] = i
else:
hasMap[token] = i
res = max(res, p-i)
return res
# 方法2: 类似于双指针进一步优化hasMap()
def lengthOfLongestSubstring(self, s: str) -> int:
s = list(s)
hashmap = {}
start, end = 0,0
maxlen = 0
for i,j in enumerate(s):
if j in hashmap:
# 这一步自己做肯定会忘记
if start>hashmap[j]:
hashmap[j] = i
else:
start = hashmap[j] + 1
end += 1
hashmap[j] = i
maxlen = max([maxlen, end-start])
return maxlen
# 方法3: 代码进一步整理
def lengthOfLongestSubstring(self, s: str) -> int:
s = list(s)
hashmap = {}
start, end = 0,0
maxlen = 0
for i,j in enumerate(s):
if j in hashmap:
# 这一步自己做肯定会忘记
if start <= hashmap[j]:
start = hashmap[j] + 1
end += 1
hashmap[j] = i
maxlen = max([maxlen, end-start])
return maxlen