滑动窗口 01

61 阅读1分钟

LeetCode 3

原题链接

代码如下:

/*
 * 使用滑动窗口算法,窗口长度是动态的,只要后面出现的元素不在记录集合中
 * 就可以继续延伸。碰到重复的字母时,应该将左指针向后移动一位,然后将第一位
 * 字母从记录集合中删除,最后再更新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;
    }
}