请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。
假设字符串中只包含从’a’到’z’的字符。
样例
输入:"abcabc" 输出:3
思路
滑动窗口思想:
使用左右指针确定窗口的大小。使用哈希表存储窗口内的字符,具体滑动过程如下:
1. 右指针先向右移动,如果哈希表内没有发现当前的字符,则加入哈希表,计数+1,指针继续右移;
2. 如果右指针指向的字符已存在,那么保持右指针不动,左指针右移,并从哈希表中剔除,计数值-1,直到窗口内不存在重复字符,再重复1;
3. 因为有可能遍历完了都没发现重复字符,这样就导致结果没有得到更新,因此循环结束时需要再判断一次。
class Solution { public int longestSubstringWithoutDuplication(String s) { if (s == null || s.length() == 0) { return 0; } HashSet<Character> set = new HashSet<>(); int res = 1; int tmp = 0; int l = 0; int r = 0; while (r < s.length()) { if (!set.contains(s.charAt(r))) { tmp++; set.add(s.charAt(r++)); } else { res = Math.max(res,tmp); tmp--; set.remove(s.charAt(l++)); } } res = Math.max(res,tmp); return res; } }