请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。
示例 1:
输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: "bbbbb" 输出: 1 解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: "pwwkew" 输出: 3 解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。 请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
示例代码1:
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
if not s:
return 0
n = len(s)
ret = []
for i in range(n):
tmp = []
tmp.append(s[i])
j = i + 1
while j < n:
if s[j] not in tmp:
tmp.append(s[j])
j += 1
continue
break
ret.append(len(tmp))
return max(ret)
示例代码2:
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
res = tmp = 0
dic = {}
for j in range(len(s)):
i = dic.get(s[j], -1) # 获取索引i
dic[s[j]] = j # 更新哈希表
tmp = tmp + 1 if j - i > tmp else j - i # dp[j-1] -> dp[j]
res = max(res, tmp) # max(dp[j - 1], dp[j])
return res
示例代码3:
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
res = tmp = 0
for j in range(len(s)):
i = j - 1
while i >= 0 and s[i] != s[j]:
i -= 1 # 线性查找 i
tmp = tmp + 1 if j - i > tmp else j - i # dp[j - 1] -> dp[j]
res = max(tmp, res) # max(dp[j - 1], dp[j])
return res
示例代码4:
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
dic = {}
res = 0
i = -1
for j in range(len(s)):
if s[j] in dic:
i = max(dic[s[j]], i) # 更新左指针 i
dic[s[j]] = j # 哈希表记录
res = max(res, j -i) # 更新结果
return res