public int lengthOfLongestSubstring(String s) {
int n = s.length(), ans = 0;
Map<Character, Integer> map = new HashMap<>();
for (int i = 0, j = 0; j < n; j++) {
if (map.containsKey(s.charAt(j))) {
i = Math.max(map.get(s.charAt(j)), i);
}
ans = Math.max(ans, j - i + 1);
map.put(s.charAt(j), j + 1);
}
return ans;
}
- 定义两个指针 i 和 j,分别表示子串的左右边界
- 使用一个哈希表来记录每个字符最后一次出现的位置
- 不断移动右指针 j,同时更新左指针 i 的位置,直到找到一个不含有重复字符的子串为止
- 在这个过程中,使用哈希表来快速判断是否有重复字符
- 最后返回最长子串的长度。
这段代码的时间复杂度为 O(n),其中 n 是字符串的长度。