题目
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
1 2 3
| 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
|
示例 2:
1 2 3
| 输入: "bbbbb" 输出: 1 解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
|
示例 3:
1 2 3 4
| 输入: "pwwkew" 输出: 3 解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。 请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
|
题解
思路
就是官方题解最后一个的Python版。设置一个变量i代表最大字串的起始位置,j是遍历的循环变量,ans代表最终长度。
设置了一个字典映射,键是str中出现的字符,值是这个键最后出现的位置加一。
实时的待定字符串就是s[i:j]
当j循环的时候,如果s[j]不在字典中或者s[j]在字典中但是它的位置出现在i之前,这就说明这个字符没有出现过待定字符串中,那么最终结果要增加,同时更新字典。
如果s[j]在字典中并且出现位置在i之后,这就说明这个字符出现在待定字符串中,那就需要把i更新到这个字符出现后的第一个位置,即字典中的值。
代码
1 2 3 4 5 6 7 8 9 10
| class Solution: def lengthOfLongestSubstring(self, s: str) -> int: i,ans = 0, 0 hash_dict = {} for j in range(len(s)): if hash_dict.get(s[j]) is not None and hash_dict.get(s[j]) > i: i = hash_dict.get(s[j]) ans = max(ans, j - i + 1) hash_dict[s[j]] = j + 1 return ans
|