Недавно в интервью меня спросили о длине самой длинной подстроки без повторений.
Пример :
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"));