CCCPaste

Longest Substring Without Repeating Character...

// 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;
    }
}