请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。
示例 1:
输入: "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
提示:
s.length <= 40000
解题思路:滑动窗口法。两个指针分别指向子串的左右两端,外循环每次向右移动左指针,寻找以i起始的最长子串,内循环寻找最长子串的右边界,通过HashSet能否添加来判断是否出现了重复字符。找到最长子串后,将左指针右移并且set删除掉左指针指向的值(无需重新左指针开始判断是否重复),进入下一个外循环。
class Solution {
public int lengthOfLongestSubstring(String s) {
Set<Character> set = new HashSet<Character>();
int r = 0;
int ret = 0;
for(int l = 0; l < s.length(); l++){
set.add(s.charAt(l));
if(l > r) r = l;
while(r < s.length() - 1 && set.add(s.charAt(r+1))){
r++;
}
ret = Math.max(ret, r - l + 1);
set.remove(s.charAt(l));
}
return ret;
}
}