← Strings

Longest No-Repeat Substring

Medium
Python
def length_of_longest_substring(s):
    seen={}; best=left=0
    for r,c in enumerate(s):
        if c in seen and seen[c]>=left: left=seen[c]+1
        seen[c]=r; best=max(best,r-left+1)
    return best
Java
public int lengthOfLongestSubstring(String s){
    Map<Character,Integer> map=new HashMap<>();
    int best=0,left=0;
    for(int r=0;r<s.length();r++){
        char c=s.charAt(r);
        if(map.containsKey(c)&&map.get(c)>=left) left=map.get(c)+1;
        map.put(c,r); best=Math.max(best,r-left+1);
    } return best;
}

Key Insight

Sliding window. enumerate vs index. 'in' vs containsKey().

Python → Java Differences

  • enumerate vs manual index
  • 'c in dict' vs containsKey()
  • Sliding window identical
Python
def length_of_longest_substring(s):
    seen={}; best=left=0
    for r,c in enumerate(s):
        if c in seen and seen[c]>=left: left=seen[c]+1
        seen[c]=r; best=max(best,r-left+1)
    return best
Java
public int lengthOfLongestSubstring(String s){
    Map<Character,Integer> map=new HashMap<>();
    int best=0,left=0;
    for(int r=0;r<s.length();r++){
        char c=s.charAt(r);
        if(map.containsKey(c)&&map.get(c)>=left) left=map.get(c)+1;
        map.put(c,r); best=Math.max(best,r-left+1);
    } return best;
}

Algorithm Steps

1. Slide window
2. Track last seen
3. Move left on repeat