代码如下:
/*
* 使用滑动窗口算法,窗口长度是动态的,只要后面出现的元素不在记录集合中
* 就可以继续延伸。碰到重复的字母时,应该将左指针向后移动一位,然后将第一位
* 字母从记录集合中删除,最后再更新ans,右指针继续向右移动。
*
* Code by java
*/
class Solution {
// public static void main(String[] args) {
// String kk = "abcabcabcad";
// System.out.println(Solution.lengthOfLongestSubstring(kk));
// }
public /* static */ int lengthOfLongestSubstring(String s) {
// 哈希集合,记录每个字符是否出现过
Set<Character> memory = new HashSet<Character>();
int n = s.length();
int right = 0, ans = 0;
for (int i = 0; i < n; i++) { //i为左指针,循环向右依次移动,right为右指针
if (i != 0) {
// 左指针向右移动一格,移除一个字符
memory.remove(s.charAt(i - 1));
}
while (right < n && !memory.contains(s.charAt(right))) {
// 不断地移动右指针
memory.add(s.charAt(right));
right++;
}
// 第 i 到 right 个字符是一个极长的无重复字符子串
//更新ans
ans = Math.max(ans, right - i);
}
return ans;
}
}