// Longest Substring Without Repeating Characters - https://leetcode.com/problems/longest-substring-without-repeating-characters/description/
class Solution {
// Brute Force
// Time Complexity: O(n^2)
// Space Complexity: O(m) where m is length of longest substring
// public int lengthOfLongestSubstring(String s) {
// int maxLength = 0;
// for(int i = 0; i < s.length(); i++) {
// int len = 1;
// Set set = new HashSet<>();
// set.add(s.charAt(i));
// for(int j = i+1; j < s.length(); j++) {
// if (set.contains(s.charAt(j))) {
// break;
// }
// else {
// set.add(s.charAt(j));
// len++;
// }
// }
// maxLength = Math.max(len, maxLength);
// }
// return maxLength;
// }
// Sliding Window
// Time Complexity: O(n)
// Space Complexity: O(m) where m is length of longest substring
// public int lengthOfLongestSubstring(String s) {
// int maxLength = 0;
// int left = 0, right = 0;
// Set set = new HashSet<>();
// for(int i = 0; i < s.length(); i++) {
// while(set.contains(s.charAt(i))) {
// set.remove(s.charAt(left));
// left++;
// }
// set.add(s.charAt(i));
// maxLength = Math.max(right - left + 1, maxLength);
// right++;
// }
// return maxLength;
// }
// Sliding Window (Optimised)
// Time Complexity: O(n)
// Space Complexity: O(m) where m is length of longest substring
public int lengthOfLongestSubstring(String s) {
int maxLength = 0;
int left = 0;
Map map = new HashMap<>();
for(int right = 0; right < s.length(); right++) {
if(map.containsKey(s.charAt(right))) {
left = Math.max(map.get(s.charAt(right)) + 1, left);
}
map.put(s.charAt(right), right);
maxLength = Math.max(right - left + 1, maxLength);
}
return maxLength;
}
}