Недавно в интервью меня спросили о длине самой длинной подстроки без повторений.

Пример :

longestSubstringWithoutRepetation(“wpwkew”);===› 4

Сначала я пробовал с массивами, но методом проб и ошибок понял, что Map будет лучшей структурой данных для использования здесь.

Map(1) { 'w' =› 0 }
Map(2) { 'w' =› 0, 'p' =› 1 }
Map(1) { 'p' =› 1 }
Map(2) { 'p' => 1, 'w' => 2 }
Map(3) { 'p' => 1, 'w' => 2, 'k' =› 3 }
Map(4) { 'p' =› 1, 'w' =› 2, 'k' =› 3, 'e' =› 4 }
Map(1) { 'k' => 3 }
Map(2) { 'k' => 3, 'e' => 4 }
Map(3) { 'k' => 3, 'e' = › 4, 'ш' =› 5 }

Map(1) { 'w' =› 0 }
Map(2) { 'w' =› 0, 'p' =› 1 }
Map(1) { 'p' =› 1 }
Map(2) { 'p' => 1, 'w' => 2 }
Map(3) { 'p' => 1, 'w' => 2, 'k' =› 3 }
Map(4) { 'p' =› 1, 'w' =› 2, 'k' =› 3, 'e' =› 4 }
Map(1) { 'k' => 3 }
Map(2) { 'k' => 3, 'e' => 4 }
Map(3) { 'k' => 3, 'e' = › 4, 'ш' =› 5 }

Основная проблема, с которой я столкнулся здесь, - это сохранение индекса последнего повторяющегося символа и его увеличение на следующей итерации. Так что 1-й повторяющийся символ не встречается.

Решение:

const longestSubsetWithoutRepeating = (s) => {
var letters = s.split("");
var result = new Map();
let maxLen = 0;
for (let i = 0; i < s.length; i++) {
if (!result.has(letters[i])) {
result.set(letters[i], i);
console.log(result);
} else {
i = result.get(letters[i]);
result.clear();
}
if (maxLen < result.size) {
maxLen = result.size;
}
}
return maxLen;
};
console.log(longestSubsetWithoutRepeating("wpwkew"));