3. Longest Substring Without Repeating Characters
Two pointers 配合 HashSet
相当于控制一个小窗,如果下一个字母是新的字母,那小窗就往右移一格,同时检查一下是不是最大长度,如果下一个字母是有重复的,那么就让小窗的左侧往右移动到第一个不是该字母的地方。
需要注意的是,小窗左侧移动的时候,小窗右侧也要往右边移动一次,不然下一轮检查的时候,对于同一个字母会检查两次,前面的都被删光了
1 public int lengthOfLongestSubstring(String s) { 2 if(s == null || s.length() == 0) { 3 return 0; 4 } 5 int walker = 0; 6 int runner = 0; 7 int maxLen = 0; 8 Set<Character> set = new HashSet<Character>(); 9 while(runner < s.length()) { 10 char c = s.charAt(runner); 11 if(set.contains(c)) { 12 while(s.charAt(walker) != c) { 13 set.remove(s.charAt(walker)); 14 walker++; 15 } 16 walker++; 17 runner++; 18 } else { 19 set.add(c); 20 runner++; 21 maxLen = (maxLen < runner - walker)? (runner - walker): maxLen; 22 } 23 } 24 return maxLen; 25 }
bug记录:
犯了一个特别隐蔽的傻错误,在第13,14行的地方,我先walker++,再remove,那么就删错了字母………………