题目
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例
输入: "abcabcbb"
输出: 3
解释:因为无重复字符的最长子串是 "abc",所以其`长度为 3。
思路
滑动窗口
我们使用 HashSet 将字符存储在当前窗口 [i, j)[i,j)(最初 j = ij=i)中。 然后我们向右侧滑动索引 jj,如果它不在 HashSet 中,我们会继续滑动 jj。直到 s[j] 已经存在于 HashSet 中。此时,我们找到的没有重复字符的最长子字符串将会以索引 ii 开头。如果我们对所有的 ii 这样做,就可以得到答案
优化的滑动窗口
如果 s[j]s[j] 在 [i, j)[i,j) 范围内有与 j`重复的字符,我们不需要逐渐增加 i 。 我们可以直接跳过 [i,j']范围内的所有元素,并将 i变为 j' + 1
代码
滑动窗口
class Solution {
publicint lengthOfLongestSubstring(String s) {
int i = 0,j = 0,ans = 0;
int len = s.length();
Set<Character> set = new HashSet<>();//char 和 Character的区别在哪
while(i < len && j < len){
if(!set.contains(s.charAt(j))){
set.add(s.charAt(j++));
ans = Math.max(ans, j-i);//c++ 中的max
}
else{
set.remove(s.charAt(i++));
}
}
return ans;
}
}
优化的滑动窗口
class Solution {
public int lengthOfLongestSubstring(String s) {
int i = 0,j = 0,ans = 0;
int len = s.length();
Map<Character, Integer> map = new HashMap<>();
for( i = 0,j = 0;j < len;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;
}
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。