// Longest Substring Without Repeating Characters - https://leetcode.com/problems/longest-substring-without-repeating-characters/description/?source=submission-ac class Solution { // Time Complexity: O(N^2) // Space Complexity; O(k) // where k is the length of longest substring // public int lengthOfLongestSubstring(String s) { // int maxLength = 0; // for(int i = 0; i < s.length(); i++) { // Set set = new HashSet<>(); // set.add(s.charAt(i)); // int currentLength = 1; // for(int j = i + 1; j < s.length(); j++) { // if(set.contains(s.charAt(j))) { // break; // } // set.add(s.charAt(j)); // currentLength++; // } // if(currentLength > maxLength) { // maxLength = currentLength; // } // } // return maxLength; // } // Time Complexity: O(n) // Space Complexity: O(k) // where n is the string length // and k is the size of the character set // public int lengthOfLongestSubstring(String s) { // Set window = new HashSet<>(); // int left = 0, right = 0, maxLength = 0; // for(; right < s.length(); right++) { // Character c = s.charAt(right); // while(window.contains(c)) { // window.remove(s.charAt(left)); // left++; // } // window.add(c); // maxLength = Math.max(maxLength, right - left + 1); // } // return maxLength; // } // Time Complexity: O(n) // Space Complexity: O(k) // where k is the size of the character set public int lengthOfLongestSubstring(String s) { if (s == null || s.length() == 0) { return 0; } // Assuming ASCII character set (128 characters) // We store the last index where we saw each character. int[] lastSeenIndex = new int[128]; Arrays.fill(lastSeenIndex, -1); // -1 means "not seen yet" int maxLength = 0; int left = 0; // The left boundary of the sliding window for (int right = 0; right < s.length(); right++) { char c = s.charAt(right); // Check if the character was seen before and if its last // occurrence is inside our current window [left, right]. if (lastSeenIndex[c] >= left) { // Duplicate found in the window. // Move the left pointer to the position after the last occurrence. left = lastSeenIndex[c] + 1; } // Update the last seen index for this character to the current position. lastSeenIndex[c] = right; // Calculate the length of the current window and update max. maxLength = Math.max(maxLength, right - left + 1); } return maxLength; } }