Given a string, find the length of the longest substring without repeating characters. For example, the longest substring without repeating letters for "abcabcbb" is "abc", which the length is 3. For "bbbbb" the longest substring is "b", with the length of 1.
Key to solve: HashSet + two pointers in window's range method
Idea:
1. Maintain a window's range area by using two points: left & right <=s.length();
2. check the String condition of each time in this Window's range
Two cases determine:
2.1: Normal case: right pointer move forward => right++;
2.2: Duplicated case: left pointer move forward(=> left++) & remove it from HashSet
until no more duplicated was found
3. Do not forget to Maintain a maxCount length between max and range size of left and right
Time complexity: O(2*N) => O(N) since both left, right point only scan once
Space Complexity: O(N) size of HashSet
Check the coding in detail below:
public class Solution {
public int lengthOfLongestSubstring(String s) {
if(s.length()==0 || s==null) return 0;
HashSet<Character> set=new HashSet<Character>();
int maxCount=0;
int left=0;
int right=0;
while(right<s.length()){
if(!set.contains(s.charAt(right))){ //normal case
set.add(s.charAt(right));
}else{ //Duplicated case
//Maintain a max length count between maxCount and range size of left and right
maxCount=Math.max(maxCount,right-left);
while(s.charAt(left)!=s.charAt(right)){
//move left point to the duplicated position
set.remove(s.charAt(left));
left++;
}
//skip duplication
left++;
}
right++;
}
maxCount=Math.max(maxCount,right-left);
return maxCount;
}
}