Longest Substring Without Repeating Characters
javaJavainterview-prepintermediatejava
A sliding window over the string that remembers where each character was last seen, so the window start only ever moves forward.
import java.util.*;
public class LongestSubstring {
public static void main(String[] args) {
System.out.println(lengthOfLongestSubstring("abcabcbb")); // 3
System.out.println(lengthOfLongestSubstring("bbbbb")); // 1
System.out.println(lengthOfLongestSubstring("pwwkew")); // 3
System.out.println(lengthOfLongestSubstring("abba")); // 2
System.out.println(lengthOfLongestSubstring("")); // 0
}
// Sliding window, O(n) time. The window is s[start..end] and never contains a repeated character.
static int lengthOfLongestSubstring(String s) {
Map<Character, Integer> lastSeen = new HashMap<>();
int best = 0, start = 0;
for (int end = 0; end < s.length(); end++) {
Integer previous = lastSeen.put(s.charAt(end), end);
if (previous != null && previous >= start) {
start = previous + 1; // jump just past the earlier copy
}
best = Math.max(best, end - start + 1);
}
return best;
}
}