题目
给定一个字符串,找出不含有重复字符的最长子串的长度。
示例 1:
输入: "abcabcbb"
输出: 3
解释: 无重复字符的最长子串是 "abc",其长度为 3。
示例 2:
输入: "bbbbb"
输出: 1
解释: 无重复字符的最长子串是 "b",其长度为 1。
示例 3:
输入: "pwwkew"
输出: 3
解释: 无重复字符的最长子串是 "wke",其长度为 3。
请注意,答案必须是一个子串,"pwke" 是一个子序列 而不是子串。
思路
使用 set,把出现过的字符都放入 set 中,遇到 set 中没有的字符就加入 set 中并更新结果 res,然后右边界 +1,如果遇到重复的,则删除 set 中下标为左边界的字符,即遇到一个重复字符,则删除一个 set 中的字符,然后左边界 +1:
代码
public int lengthOfLongestSubstring(String s) {
HashSet<Character> set = new HashSet<Character>();
int left = 0;//左指针
int res = 0;//最长字符串长度
int setSize = 0;//set中元素个数
set.add(s.charAt(left));
res++;
setSize++;
for(int i = 1;i < s.length(); i++){
char c = s.charAt(i);
if(!set.contains(c)){
set.add(c);
setSize++;
res = Math.max(res, setSize);
}else{
while(set.contains(c)){//有重复元素则删除最左边元素,直到没有重复的元素为止
set.remove(s.charAt(left));
left++;
setSize--;
}
set.add(c);
setSize++;
}
}
return res;
}