Solution to Longest Substring Without Repeating Characters Problem.

class Solution {
    public int lengthOfLongestSubstring(String s) {
        int winStart = 0;
        int ans = 0;
        Map<Character, Integer> seenChars = new HashMap<>();    
        for(int winEnd = 0; winEnd < s.length(); winEnd++) {
            char curChar = s.charAt(winEnd);
            if(seenChars.containsKey(curChar)) {
                System.out.println("string before adjustment "+ s.substring(winStart, winEnd+1));
                // To understand why Math.max is needed use i/p "abba".
                winStart = Math.max(seenChars.get(curChar) + 1, winStart);
                System.out.println("string after adjustment "+ s.substring(winStart, winEnd+1));
            }
            ans = Math.max(ans, (winEnd-winStart) + 1);
            seenChars.put(curChar, winEnd);
        }
        
        return ans;
    }
}