题目
请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。
示例 1:
输入: "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
提示:
s.length <= 40000
注意:本题与主站 3 题相同:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/zui-chang-bu-han-zhong-fu-zi-fu-de-zi-zi-fu-chuan-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路
首先想到的直接扫描过去,在每个字符从后往前找到相同的字符,算一个长度。很显然这样的算法复杂度是。
并且这个思路有问题,没有考虑这两个字符之间还夹着相同字符的可能!
稍加改进,把算出来的长度和之前的比一下,以防前面的两个相同卡在这个字符串里,另外,为了迅速找到对应的字符在前面出现的位置,建立一个哈希表。
可以问清楚是否只有26个字符,是的话可以直接用list作为表。
代码
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
if len(s)<=1:return len(s)
position = {}
dp = [1]*len(s)
position[s[0]] = 0
for i in range(1,len(s)):
char = s[i]
index = position[char] if char in position else -1
if index == -1 or i-index > dp[i-1]: dp[i] = dp[i-1] + 1
elif i - index <= dp[i-1]: dp[i] = i - index
# 更新最新位置
position[char] = i
return max(dp)