/*
* Finds the longest substring without repeating characters.
* Uses a sliding window and a table of last-seen indexes.
*
* Time complexity: O(n)
*/
function longestUniqueSubstring(str: string): string {
const lastSeen: number[] = Array(256).fill(-1);
let left: number = 0;
let bestStart: number = 0;
let bestLength: number = 0;
for (let right: number = 0; right < str.length; right++) {
const c: number = str.charCodeAt(right);
// If character was seen inside the current window, move left
if (lastSeen[c] >= left) {
left = lastSeen[c] + 1;
}
// Update last-seen index
lastSeen[c] = right;
// Check if this window is the best so far
const windowLength: number = right - left + 1;
if (windowLength > bestLength) {
bestLength = windowLength;
bestStart = left;
}
}
return str.slice(bestStart, bestStart + bestLength);
}
const str: string = "xwwwqfwwxqwyq";
const result: string = longestUniqueSubstring(str);
console.log("Input:", str);
console.log("Longest substring without repeating characters:", result);
/*
run:
Input: xwwwqfwwxqwyq
Longest substring without repeating characters: xqwy
*/