给定一个字符串,找出不含有重复字符的最长子串的长度。
示例:
给定 “abcabcbb” ,没有重复字符的最长子串是 “abc” ,那么长度就是3。
给定 “bbbbb” ,最长的子串就是 “b” ,长度是1。
给定 “pwwkew” ,最长子串是 “wke” ,长度是3。请注意答案必须是一个子串,“pwke” 是 子序列 而不是子串。
- 思路: 利用字典和一个中间变量,将字符串中的字符逐个加入到字典里,如果字典中已经未存在改字符,则key为字符,value为对应下标,且中间变量值加1;若已存在,则更新value为新下标,如果两个相同字符之间的下标差大于中间变量,则中间变量加1
class Solution:
def lengthOfLongestSubstring(self, s):
"""
:type s: str
:rtype: int
"""
# 定义一个字典和初始化最大子串长度和中间变量长度为0
record_place = {}
max_len = 0
mid_max_len = 0
for (i, ch) in enumerate(s):
# 判断字符是否在字典里
if ch not in record_place:
mid_max_len += 1
if max_len < mid_max_len:
max_len = mid_max_len
else:
# 比较两个相同字符之间的长度是否大于中间变量,
# 是则中间变量加1,否则中间变量为俩字符间长度
if i - record_place[ch] > mid_max_len:
mid_max_len += 1
if mid_max_len > max_len:
max_len = mid_max_len
else:
mid_max_len = i - record_place[ch]
record_place[ch] = i
return max_len
leetcode上最优的解法是利用hashTable来处理,代码如下:
class Solution:
def lengthOfLongestSubstring(self, s):
"""
:type s: str
:rtype: int
"""
hashTable = {}
max_len = 0
cur = 0
for i, c in enumerate(s):
if c in hashTable and cur <= hashTable[c]:
print(c, hashTable[c])
cur = hashTable[c] + 1
else:
max_len = max(max_len, i - cur + 1)
hashTable[c] = i
return max_len