Use a window to keep the longest substring without repeating characters. Whenever we find a repeating character, move the left side of the window until we meet this character.
public int lengthOfLongestSubstring(String s) { int n = s.length(); if(n == 0) return 0; // corner case int p1 = 0, p2 = 0, res = Integer.MIN_VALUE; HashSet<Character> set = new HashSet<Character>(); while(p1 < n) { while(p2 < n && set.contains(s.charAt(p2)) == false) { set.add(s.charAt(p2)); p2++; } res = Math.max(res, p2 - p1); if(p2 == n) { // all cases have been examined break; } char ch = s.charAt(p2); while(p1 < n && s.charAt(p1) != ch) { // move all characters that is before the duplicate out set.remove(s.charAt(p1)); p1++; } p1++; p2++; // remember to move p2 forward } return res; }
没有评论:
发表评论