CCCPaste

Longest Substring Without Repeating Character...

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