原题
https://leetcode.cn/problems/longest-substring-without-repeating-characters/
思路
双指针,右指针遍历,如果右指针遇到重复字母,那么将左指针移至该字符索引的下一个。
复杂度
时间:O(n)
空间:O(1)
Python代码
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
# 使用字典记录字符和下标
d = dict()
# 初始化结果
ans = 0
left = 0
for i, ch in enumerate(s):
if ch in d:
# 更新left的位置
left = max(left, d[ch] + 1)
# 更新字符的最新位置
d[ch] = i
ans = max(ans, i-left+1)
return ans
Java代码
class Solution {
public int lengthOfLongestSubstring(String s) {
HashMap<Character, Integer> map = new HashMap<>();
int ans = 0;
int left = 0;
for (int right = 0; right < s.length(); right++) {
char ch = s.charAt(right);
if (map.containsKey(ch))
// 将左指针移至字符索引的下一个
left = Math.max(left, map.get(ch) + 1);
map.put(ch, right);
ans = Math.max(ans, right - left + 1);
}
return ans;
}
}