Given a string `s`

, find the length of the **longest substring** without repeating characters.

**Example 1:**

Input:s = "abcabcbb"Output:3Explanation:The answer is "abc", with the length of 3.

**Example 2:**

Input:s = "bbbbb"Output:1Explanation:The answer is "b", with the length of 1.

**Example 3:**

Input:s = "pwwkew"Output:3Explanation:The answer is "wke", with the length of 3. Notice that the answer must be a substring, "pwke" is a subsequence and not a substring.

**Example 4:**

Input:s = ""Output:0

**Constraints:**

`0 <= s.length <= 5 * 10`

^{4}`s`

consists of English letters, digits, symbols and spaces.

public int lengthOfLongestSubstring(String s) {
int i=0;
int j=0;
int max = 0;
HashSet<Character> set = new HashSet<Character>();
while(j<s.length() && i<s.length()){
char sc = s.charAt(i);
char ec = s.charAt(j);
if(set.contains(ec)){
set.remove(sc);
i++;
}
else{
set.add(ec);
max = Math.max(max, set.size());
j++;
}
}
return max;
}

The basic idea of solving this problem is to keep track of all the characters we have already visited and maintain a window size in which each character appeared only once. So throughout the traversal whenever the window size is maximum, that will give us the result.

Time Complexity: O(n) // For traversing all the items in the array.

Space Complexity: O(n) // for keeping track of already visited items in the window, in the worst case all items will be present in the HashSet.