Тёмный

Solving the problem from JS interview - The valid sequence of brackets | LeetCode problems 

Front-end Science with Sergey Puzankov
Подписаться 62 тыс.
Просмотров 38 тыс.
50% 1

Привет, друзья!
Сегодня решаем с вами задачу про правильную последовательность скобочек. Это очень известная и очень популярная задача на IT собеседованиях. Причем не только на фронтенд собеседованиях! Прислал нам эту задачу наш подписчик ivan rusin, которому она попалась на бэкенд собеседовании.
На Литкоде эта задача easy уровня сложности. На мой взгляд, не такая уж она и easy - не каждый новичок сходу сам осилит.
По условиям: на вход нам приходит строка, содержащая только символы скобок. Следующие символы скобочек: ( ) { } [ ]. Необходимо написать функцию, которая проверит такую строку и вернет в результате true или false - в зависимости от того, является ли данная последовательность скобок валидной или нет.
Вот несколько примеров, чтоб разобраться, что такое валидная, а что такое невалидная последовательность скобок:
"()" // true
"()[]{}" // true
"(]" // false
"([)]" // false
"{[]}" // true
Длина нашей строки может быть от 1 до 10 000 символов. По условию это все.
👍 Присылайте ваше решение в комменатриях! С интересом посмотрю!
👍 Друзья, поддержите наш канал - поставьте этому видео лайк и поделитесь им с друзьями!
Таймкоды:
00:00 Интро
00:41 Условие задачи
02:37 Алгоритм решения в общем виде
04:18 Что такое stack
05:11 Алгоритм решения через stack
07:28 Пишем код
13:22 Проверяем решение
14:36 Сложность алгоритма
14:55 Присылайте ваши решения
✅ Задача на Leetcode: leetcode.com/problems/valid-p...
✅ Код из видео: codepen.io/puzankov/pen/poPRe...
👍 🤩 Поддержите наш канал на Патреоне: / frontendscience
---
Если видео было для вас полезным, ставьте лайк и поделитесь им с друзьями.
Подписывайтесь на наш канал: bit.ly/fs-ytb
---
Присоединяйтесь к нам в соцсетях:
FB: / frontendscience
Instagram Сергея Пузанкова: / puzankovcom
Заходите на наш сайт: frontend-science.com/
Music:
Blue Wednesday "From a friend",
Blue Wednesday & Dillan Witherow - Long Walk Short Dock.
---
#ityoutubersru​ #фронтенд #алгоритмы #leetcode

Опубликовано:

 

10 июн 2024

Поделиться:

Ссылка:

Скачать:

Готовим ссылку...

Добавить в:

Мой плейлист
Посмотреть позже
Комментарии : 190   
@romanryaboshtan9270
@romanryaboshtan9270 2 года назад
У человека удивительный талант учить, понятно показывать, я такого ещё не видел
@frontendscience
@frontendscience 2 года назад
Рад, что было Вам полезно. Благодарю
@Zavyalovvvvv
@Zavyalovvvvv 2 года назад
да, про стэк было бы полезно послушать... Заранее спасибо!
@frontendscience
@frontendscience 2 года назад
И Вам. спасибо! Будет, значит)
@alchemynotes
@alchemynotes 2 года назад
Блин, я как раз в прошлом месяце искала такой видос :( И нашла только какой-то шестилетней давности :( Спасибо! Полезно! И монтаж такой клевый, каждый раз приятно удивляюсь :3
@frontendscience
@frontendscience 2 года назад
Спасибо большое! Рад, что понравилось и что полезно!
@falconeye4172
@falconeye4172 2 года назад
Thank you so much Sergey for your work! Would be great to watch your video about different data structures.
@frontendscience
@frontendscience 2 года назад
Thank you for watching! Got it)
@pavelgonzales_
@pavelgonzales_ Год назад
Дай бог тебе здоровья, Сережа ))))
@user-hk6bu5wc1d
@user-hk6bu5wc1d 2 года назад
Данную задачу уже во второй раз встречаю за свою еще даже не начавшуюся карьеру. Видимо любят ее задавать
@SiniyPetr
@SiniyPetr 2 года назад
так просто, чтобы было, тоже свое решение оставлю) function isValidString(str){ let tempStr = str; let spliters = ['()', '[]' , '{}']; for (let i = 0 ; i < spliters.length ; i++){ if (!tempStr.length) return true; tempStr = tempStr.split(spliters[i]).join(''); } if (str.length === tempStr.length) { return false; } else { return isValidString(tempStr); } } п.с.: спасибо за качественный контент, приятно и смотреть и разбираться вместе над frontend задачами
@user-xt9nl7no8e
@user-xt9nl7no8e 2 года назад
Варіант автора відео найвигідніший, найпростіший, найкоротший, на те він і наш вчитель з великим досвідом)
@ggaltqq
@ggaltqq 2 года назад
Где-то читал( уже не вспомню) , что в именованиях лучше не использовать прошедшее время( если только домен этого не требует). И фонетически "isClosingBracket" звучит лучше. И спасибо за видосы)
@lolitamalinovskaya5006
@lolitamalinovskaya5006 2 года назад
Спасибо Вам! Очень познавательно!)
@frontendscience
@frontendscience 2 года назад
И Вам спасибо! Рад, что оказалось полезно)
@iOS1927
@iOS1927 3 месяца назад
Четкий мужик! Большое спасибо 👍👍
@keiVision
@keiVision 2 года назад
Больше задач БОЛЬШЕЕЕЕ
@user-vt7ih2wr1d
@user-vt7ih2wr1d Год назад
Спасибо, хорошее объяснение :)
@nikitafamily5341
@nikitafamily5341 Год назад
Красивое решение через словарь!
@murcha5899
@murcha5899 Год назад
хороший канал. приятное объяснение.
@user-up9zq1nw4n
@user-up9zq1nw4n 2 года назад
Спасибо большое!
@_alexanderd
@_alexanderd 2 года назад
Решил на php за 15 мин где-то через рекурсивный проход. В самом начале сделал проверку на четность кол-ва скобочек, чтобы сразу отсеять невалид. Решение через стек элегантнее конечно, т.к. нет необходимости обрабатывать всю строку.
@eeonelix2681
@eeonelix2681 2 года назад
Только вчера решил такую задачу на codewars)
@alexandervoievodin6913
@alexandervoievodin6913 2 года назад
Спасибо за видео! Немного изменил код, кому как больше по вкусу. function isValid(s) { const stack = []; const brackets = { ')': '(', ']': '[', '}': '{', }; for (const current of s) { if (current in brackets) { if (brackets[current] !== stack.pop()) return false; } else { stack.push(current); } } return !stack.length; }
@frontendscience
@frontendscience 2 года назад
Благодарю за решение! Класс!
@alexandervoievodin6913
@alexandervoievodin6913 2 года назад
@@frontendscience Это Вам спасибо за качественный контент, Сергей!)
@yohanson555
@yohanson555 2 года назад
`current in brackets` - элегантно
@alexandervoievodin6913
@alexandervoievodin6913 2 года назад
@@yohanson555 спасибо, приятно)
@user-lt4op2rf3w
@user-lt4op2rf3w 2 года назад
Уже пятый день бьюсь над задачей, прохожу на Хекслет курс фронтенд разработчика и мы ещё не дошли до мап, предлагают решить задачу через две константы с открывающимися и закрывающимися скобками через indexOf Видео очень доступно обьяснило мне ход решения, мне было и так все понятно, но как сравнить скобки без обьекта до сих пор не понял, но обязательно дойду к этому. Спасибо, отлично делаете свое дело, удачи вам!
@frontendscience
@frontendscience 2 года назад
Рад что было полезно. Что касается варианта без объекта, то нужно создать 2 переменные ‘({[‘ и ‘)}]’ теперь с помощью indexOf в первой ищем текущую скобку и проверяем чтобы закрывающаяся была равна скобке с тем же индексом но во второй переменной
@anastasiyaboiko8862
@anastasiyaboiko8862 2 года назад
Божечки как ясно-понятно, прям для таких как я :D Спасибо!
@frontendscience
@frontendscience 2 года назад
Спасибо за поддержку! Очен рад, что было полезно :)
@MrTheDanils
@MrTheDanils 7 месяцев назад
Сергей, контент отличный! Единственный вот момент который смутил: то, что внутри цикла, есть indexof. В итоге данная реализация ведь O(n*n)? Либо я чего то не понимаю…
@user-vn9qk3eh6i
@user-vn9qk3eh6i Год назад
Thank's a greate solution!!
@SerzhNesteruk
@SerzhNesteruk 11 месяцев назад
Спасибо за видео и интересную задачу! Решение почти полностью совпало с моим (даже нейминг), только цикл в другую сторону. 🙂 const isValidBracketSequence = str => { const brackets = { ')': '(', ']': '[', '}': '{', }, stack = []; for (let i = str.length - 1; i >= 0; i--) { let char = str[i]; if (char in brackets) { stack.push(brackets[char]); } else if (char !== stack.pop()) { return false; } } return stack.length === 0; };
@SerzhNesteruk
@SerzhNesteruk 11 месяцев назад
Вот ещё альтернативное решение: const isValidBracketSequence = str => { const closedBrackets = /\(\)|\[\]|\{\}/g; while (str.match(closedBrackets)) { str = str.replace(closedBrackets, ''); } return str.length === 0; };
@charliebrown5554
@charliebrown5554 2 года назад
Спасибо большое за такое подробное разъяснение. Очень жаль, что вы прекратили выпускать видео на этом канале. Я вас прекрасно понимаю.
@denisvolkov4784
@denisvolkov4784 Год назад
На середине 5й минуты я почувствовал себя ребёнком, почти в ладоши начал хлопать, а потом вспомнил что 20минут первого, а завтра(фактически сегодня уже, блин) четверг :( з.ы. Видео класс, впрочем как и всегда.
@dryrider3881
@dryrider3881 Год назад
А что если мы можем менять местами соседние скобки ({[ или)]}бесконечное количество раз? То есть ([) ] уже будет true так как можем поменять местами последние 2. Менять, например, ( и) не можем так как смотрят в разные стороны
@user-ej2nb7yt9k
@user-ej2nb7yt9k 2 года назад
большое спасибо
@denyslinetskyi
@denyslinetskyi 2 года назад
LeetCode или CodeWars - Что посоветуете для начинающих?)
@alenachuyankova
@alenachuyankova Год назад
Круто!
@user-mn3ic2ct8d
@user-mn3ic2ct8d 2 года назад
Даёшь стэк!!!
@Parcker13
@Parcker13 2 года назад
На codwars наткнулся на эту задачу, а сегодня случайно здесь увидел.
@frontendscience
@frontendscience 2 года назад
Хорошо отработал алгоритм ютуба! ))) В современном мире не поймешь - то ли везде знаки, то ли хорошо настроенный таргетинг)
@yarik83men51
@yarik83men51 2 года назад
Спасибо за труды. Ваше решение на Java: import java.util.HashMap; import java.util.Stack; public class ValidParentheses { public static void main(String[] args) { String s1 = "()"; // true String s2 = "()[]{}"; // true String s3 = "(]"; // false String s4 = "([)]"; // false String s5 = "{([])}"; // true String test = "([{(})])"; System.out.println(isValid(s1)); System.out.println(isValid(s2)); System.out.println(isValid(s3)); System.out.println(isValid(s4)); System.out.println(isValid(s5)); System.out.println(isValid(test)); } private static boolean isValid(String str) { Stack stack = new Stack(); HashMap brackets = new HashMap(3); brackets.put(')', '('); brackets.put('}', '{'); brackets.put(']', '['); for (int i = 0; i < str.length(); i++) { char current = str.charAt(i); if (isClosed(current)) { // Закрывающиеся скобки if (brackets.get(current) != stack.pop()) { // ")" => "(" return false; } } else { // Открывающиеся скобки stack.push(current); } } return stack.empty(); } private static boolean isClosed(char chr) { char[] c = {'}', ')', ']'}; for (int i = 0; i < c.length; i++) { if (c[i] == chr) return true; } return false; } }
@koryunsahakyan-kb1tn
@koryunsahakyan-kb1tn Год назад
если на 20 строке в блоке if у тебя стейк пустой как ты сделаеш pop
@serhiiyeromin6814
@serhiiyeromin6814 Год назад
Раньше решал задачу через два масcива: с символами скобок начала и конца. Принцип тот же, но удобно сопоставлять по номеру вхождения в масив через indexOf. И работает шустрее) function isBalanced(string) { const arr = [] const start = ['{','[','('] const end = ['}',']',')'] for (let char of string) { if (start.includes(char)) arr.push(char) else if (end.includes(char)) if (arr[arr.length-1] === start[end.indexOf(char)]) arr.pop() else return false } return arr.length === 0 }
@pavelnenashev4353
@pavelnenashev4353 Год назад
точно шустрее? выборка из хэша по идее имеет сложность O[1]
@andreibudnik7435
@andreibudnik7435 2 месяца назад
Занимаюсь недавно. Сделал без использования объектов. Не знал про понятие "стека". Использовал только for, if и function. Функция ищет соседние скобки одного вида и разного направления, если находит - вырезает их через splice, увеличивает счетчик (счетчик использую как условие выхода из цикла) и заново вызывает себя. ___________________________ function validBraces(braces) { let arr = braces.split(''); let ciclCounter = 0; const endOfCicl = arr.length; function recursDelBrasket(arr) { for (let i = 0; i < arr.length; i++) { const element = arr[i]; console.log(arr); console.log(element); if(arr.length === 0){ break; } if((element === '(') && ((i + 1) === arr.indexOf(')'))){ ciclCounter++; arr.splice(i, 2); return recursDelBrasket(arr); } if((element === '{') && ((i + 1) === arr.indexOf('}'))){ ciclCounter++; arr.splice(i, 2); return recursDelBrasket(arr); } if((element === '[') && ((i + 1) === arr.indexOf(']'))){ ciclCounter++; arr.splice(i, 2); return recursDelBrasket(arr); } if(ciclCounter >= endOfCicl){ break } } } recursDelBrasket(arr); if(arr.length === 0) { return true; } else { return false; } }
@Rogov_Oleg
@Rogov_Oleg 2 года назад
Хорошая задача. На первом собеседовании в жизни решил на Паскаль в 2007. Если человек не понимает стек и рекурсию - это не программист.
@user-eo2xm4xc8s
@user-eo2xm4xc8s 2 года назад
Снимите видео про стек!
@frontendscience
@frontendscience 2 года назад
Обязательно будет
@lu4nik440
@lu4nik440 2 года назад
Интересное решение но не был рассмотрен кейс, если строка начинается с закрывающей скобки или количество закрывающих скобок превышает количество открывающих, тогда мы вызываем метод pop() из пустого стэка, что может вызывать ошибки.
@frontendscience
@frontendscience 2 года назад
Ошибки не будет. [].pop() возвращает undefined. Дальше будет сравниваться скобка с undefined что будет возвращать false так как последовательность не валидна.
@lu4nik440
@lu4nik440 2 года назад
@@frontendscience Я имел ввиду ошибки в других языках, забыл дописать. Я сам с JS очень поверхностно знаком, поэтому не знал как в нем будет) Спасибо за объяснение!
@gl2949
@gl2949 Год назад
А почему происходит так, что stack.pop удаляет элемент, когда мы по сути берем его только для сравнения в if?
@UC1C0GDMTjasAdhELHZ6lZNg
@UC1C0GDMTjasAdhELHZ6lZNg Год назад
так работает метод pop, неважно сравниваешь ли ты или делаешь что-либо другое. Если он вызван он вернет последний элемент и удалит его из массива.
@gorshenkodenis6091
@gorshenkodenis6091 2 года назад
немогу врубиться ы это строку if (brackets[current] !== stack.pop()) return false . И почему нельзя обойтись без (brackets[current] перевертывание скобок ? может кто объяснит
@frontendscience
@frontendscience 2 года назад
ок объясню на примере: [()]. Мы прошли первые 2 символа с открывающимися скобочками и поместили их в стек. Сейчас он выглядит так: [( Доходим до закрывающегося символа ")". Нам надо сравнить что у нас вверху стека находится тоже круглая но открывающаяся скобочка. Для этого мы из таблицы соответствия закрывающих скобочек открывающимся достаем brackets[current]. current сейчас равен ")" значит brackets[current] вернет "(". И мы делаем операцию stack.pop(). Метод pop отрывает верхний элемент стека и возвращает его. Значит мы сравним "(" и "(" - и проверка вернет false значит конструкция return false не отработает и мы пойдем проверять следующую скобочку. Если бы у нас скобки не матчились - то мы сразу возвращаем false как результат работы программы
@dmytrokoka3796
@dmytrokoka3796 2 года назад
А можно про стек если видео уже конечно вышло, то кинуть ссылку, мелочь, а приятно!)
@frontendscience
@frontendscience 2 года назад
В ближайших планах. Stay tuned!
@daniilzotov6982
@daniilzotov6982 2 года назад
мне кажется без стека вполне можно обойтись : алгоритм простой - следующая скобка является ли закрывающей - да - вырежи их и проверь еще раз предыдущую let arr1='{}((({}{[]}{}{[[[]]]}{}{})))'; function convert(str){ switch (str) { case ')' : return '('; case ']' : return '['; case '}' : return '{'; default : return ' ' } } let test =function(arr){ if (arr.length%2 !=0) {return false}; // можно исключить for (let i=0; i
@frontendscience
@frontendscience 2 года назад
Благодарю за решение. Да такой вариант тоже имеет место быть - но он более "жадный" к памяти.
@evgeniychip
@evgeniychip 2 года назад
тоже на эту задачу натыкался
@frontendscience
@frontendscience 2 года назад
Да, она достаточно распространенная.
@f50ciety
@f50ciety 2 года назад
блин) а если решил после объяснения алгоритма, без подсматривания в ваш код, считается?)
@frontendscience
@frontendscience 2 года назад
Конечно! Решение задачи складывается из 2 частей - разобраться в том, каким алгоритмом ты это будешь решать, и потом все запрограммировать. Я видел очень много разработчиков, которые на собеседовании рассказывали правильно алгоритм, но не могли это запрограммировать. Так что половина работы уже есть! А определение нужного алгоритма придет с практикой ;) успехов!
@f50ciety
@f50ciety 2 года назад
@@frontendscience спасибо)) и вам)
@EvilYou
@EvilYou 2 года назад
Решал раньше такую задачу на codewars (Valid Parentheses сложностью 5 kyu), там были только круглые скобки. Задачу из видео решил двумя способами. Первый, попроще для понимания, со сложностью O (n ^ 2), второй - O (n). По памяти оба варианта O (n). Способ 1: function isValid(s) { let match = { ")": "(", "]": "[", "}": "{", } let arr = s.split(''); for (let i = arr.length - 1; i > 0; i--) { if (match[arr[i]] === arr[i - 1]) { arr.splice(i - 1, 2); } } return arr.length === 0; } Результат на leetcode: Runtime: 72 ms, faster than 85.01%. Memory Usage less than 33.16% Способ 2: function isValid(s) { let match = { ")": "(", "]": "[", "}": "{", } let stack = []; for (let i = 0; i < s.length; i++) { if (s[i] === "(" || s[i] === "[" || s[i] === "{") { stack.push(s[i]); } else if (match[s[i]] !== stack.pop()) { return false; } } return stack.length === 0; } Результат на leetcode: Runtime: 68 ms, faster than 94.38% Memory Usage less than 76.51% Кстати, мой второй вариант и решение из видео очень похожи, но мой способ немного короче :)
@frontendscience
@frontendscience 2 года назад
Благодарю за варианты решения!
@EvilYou
@EvilYou 10 месяцев назад
function isValid(s) { let arr = s.split(''); let obj = { '[': ']', '{': '}', '(': ')', }; for (let i = 0; i < arr.length - 1; i++) { if (arr[i + 1] === obj[arr[i]]) { arr.splice(i, 2); i = Math.max(i - 2, -1); } } return arr.length === 0; } Результат на leetcode: Runtime 53ms Beats 94.63% P.S. решение через стек, конечно, лучше для больших строк
@commenterwebsite1695
@commenterwebsite1695 2 года назад
Не проще просто кидать в массив пару значений, а потом сравнить, если два значения то Валид если 1, то нет?
@frontendscience
@frontendscience 2 года назад
Пришлите решение, плиз.
@ShulV
@ShulV 2 года назад
Объясните, пожалуйста, почему этот алгоритм является рекурсивным? Насколько мне известно, рекурсия в программировании - это вызов функцией самой себя. В данном коде такого нет, так в чём же заключается рекурсия?
@frontendscience
@frontendscience 2 года назад
Алгоритм который был реализован в видео не рекурсивный. Я упомянул что мы можем решить задачу рекурсивно выкусывая все пары скобочек. до тех пор пока есть что выкусывать. В этом случае функция ищет и удаляет все рядом стоящие пары скобок. И мы будем оставшуюся строку еще раз скармливать этой функции. Будет рекурсивное решение. Вариант же предложенный в видео более эффективен - работает линейно - и за один проход определяет валидность строки.
@ShulV
@ShulV 2 года назад
@@frontendscience Спасибо!
@timchenkod88
@timchenkod88 2 года назад
Про стек дуже цікаво було б, не знайшов у Вас на каналі відео про стек.
@HunterForAdventure
@HunterForAdventure 2 года назад
Спасибо за видео, мое решение: var isValid = function(s) { const map = {'(':')', '{':'}', '[':']'}; const arr = []; for (let i = 0; i < s.length; i += 1) { if (map[s[i]]) { arr.unshift(s[i]); } else if (map[arr[0]] === s[i]) { arr.shift() } else { return false; } } return arr.length === 0; };
@frontendscience
@frontendscience 2 года назад
Благодарю! Классное решение!
@n.anoshin
@n.anoshin 2 года назад
Лучше проверку на длину сделать в начале, если длина не является валидной (3, 5, 7, ... etc.), то делаем ретерн и все, чтобы не прогонять код и делать проверку в конце
@frontendscience
@frontendscience 2 года назад
ну проверку на длину оставшегося стека в конце надо делать все равно будет, без относительно проверки на четность.
@kuzm1ns
@kuzm1ns 2 года назад
Спасибо! Подсмотрел алгоритм решения в общем виде и написал своё: const brackets = { '(': ')', '{': '}', '[': ']', }; const closeBrackets = Object.entries(brackets).reduce((acc, [key, value]) => { acc[value] = key; return acc; }, {}); /** * @param {string} s * @return {boolean} */ const isValid = (s) => { const stack = []; for (let i = 0; i < s.length; i++) { const sym = s[i]; if (sym in brackets) { stack.push(sym); } else if (sym in closeBrackets) { if (!stack.length) { return false; } if (closeBrackets[sym] === stack[stack.length - 1]) { stack.pop(); } else { return false; } } } return !stack.length; };
@frontendscience
@frontendscience 2 года назад
Благодарю за решение! Отлично вышло
@kuzm1ns
@kuzm1ns 2 года назад
На интервью в одну известную компанию решил без создания обратного словаря: const brackets = { '(': ')', '{': '}', '[': ']', }; /** * @param {string} s * @return {boolean} */ const isValid = (s) => { const stack = []; for (sym of s) { if (sym in brackets) { stack.push(sym); } else if (sym !== brackets[stack.pop()]) { return false; } } return !stack.length; };
@VoCs1000
@VoCs1000 2 года назад
Нельзя ли использовать includes вместо indexOf ?
@frontendscience
@frontendscience 2 года назад
Можно. Это я по привычке
@alexey_n.
@alexey_n. Год назад
@@frontendscience было больно, когда это увидел
@user-nu7it3ez4b
@user-nu7it3ez4b 2 года назад
А если строка начинается с закрытой скобки?)
@frontendscience
@frontendscience 2 года назад
Это тоже невалидная последовательность. Алгоритм отработает правильно и сделает проверку на первом же символе. У нас будет пустой стек и закрывающуюся скобку не с чем будет сравнивать. Поэтому алгоритм вернет false.
@Ramosok
@Ramosok 3 месяца назад
@dzmitry.maslau
@dzmitry.maslau 2 года назад
Привет! А разве Stack это FILO, а не LIFO?)
@frontendscience
@frontendscience 2 года назад
я думаю тут разницы нет - главное консистентность с другими структурами (по типу очереди)
@dzmitry.maslau
@dzmitry.maslau 2 года назад
​@@frontendscience Соглашусь, это уже мелочи! В любом случае, спасибо за твои видео, и то что ты делаешь! У тебя отличный контент и очень крутое качество монтажа и съёмки!
@squabble3332
@squabble3332 Год назад
решал похожее сделал функцию на удаление из строки () [] и тд потом проверял есть ли еще такие в строке и удалял еще раз и так по кругу в цикле -) суть проверки в том что у вас всегда будет скобки которые открываются и закрываются сразу же, поэтому если таких нет, то строка с ошибкой ну и в конце если строка стала пустой то все четко, если нет то опять же ошибка
@oleksandrzz
@oleksandrzz 2 года назад
спасибо за контент =) перед решением случайно на глаза попал самый верхний комментарий, где что-то писали про стек и это стало хорошим спойлером решения) время O(n), память O(n) const isValidBrackets1 = (str) => { const brackets = str.split(''); const BRACKETS_WITH_RIGHT_AS_KEY = new Map([[')', '('], [']', '['], ['}', '{']]); const stack = []; for (let bracket of brackets) { const isLeftBracket = [...BRACKETS_WITH_RIGHT_AS_KEY.values()].includes(bracket); if (isLeftBracket) { stack.push(bracket); } else if (stack.at(-1) === BRACKETS_WITH_RIGHT_AS_KEY.get(bracket)) { stack.pop(); } else { return false; } } return stack.length === 0; }
@mykhailonikolaiev6512
@mykhailonikolaiev6512 2 года назад
мне такие задачки на codewars попадаются))на 5 kyu
@frontendscience
@frontendscience 2 года назад
Так делитесь решениями! Всем будет полезно.
@igorekupaev1134
@igorekupaev1134 2 года назад
Что думаете по поводу такого решения? function isBracketsValid (str) { for (let i = 0; i
@pavelnenashev4353
@pavelnenashev4353 Год назад
такое есть на leetcode, работает в полтора раза медленней
@alexkardone3809
@alexkardone3809 2 года назад
Ну, часа полтора точно просидел над ней. Вот мое решение: var isValid = function (s) { const arr = s.split(''); const obj = { '(': ')', '{': '}', '[': ']', }; let result = false; for (key in obj) { if (arr[0] === obj[key]) return result; } const stack = []; for (let i = 0; i < arr.length; i++) { if (stack.length === 0) { stack.push(arr[i]); continue; } for (key in obj) { if (stack[stack.length - 1] === key && arr[i] === obj[key]) stack.pop(); else if (arr[i] === obj[key]) return false; else if (arr[i] === key) stack.push(arr[i]); } } if (stack.length === 0) result = true; return result; }; const arr = ["(([])){}", "(((])))", "([)", "()", "{[]}", ")(", "([)]", "()[]{}", "{[]}()"]; arr.forEach((el) => { console.log(isValid(el)); });
@frontendscience
@frontendscience 2 года назад
Отличный вариант! Благодарю за решение!
@pavelnenashev4353
@pavelnenashev4353 Год назад
на собесе на фронта в Яндекс такое давали
@armanghazaryan1748
@armanghazaryan1748 2 года назад
пол часа потратил но по моему не плохой вариант )) const examples = { '{':'}', '[':']', '(':')'}; const stack = []; function test(str) { let result = true; [...str].forEach((item, i) => { if (examples[item]) { stack.push(item); } else if (item !== examples[stack.pop()]) { result = false; } }); return result; }
@user-iw4nw9xm8c
@user-iw4nw9xm8c Год назад
у меня двойным циклом получилось) function isValid1(s) { s = s.split("", s.length) let keys = { "()": "()", "[]": "[]", "{}": "{}" } for (let i = 0; i < s.length; i++) { if(keys[s[i] + s[i + 1]]){ for(let j = 0; j < s.length; j++){ s.splice(i, 2) i = 0 j = 0 } } } return s.length > 0 ? false : true }
@bekzodbekolimbekov5964
@bekzodbekolimbekov5964 2 года назад
такого рода задачи будут даны junior деволоперам
@frontendscience
@frontendscience 2 года назад
Я думаю, что такая задача вполне может встретиться на любом уровне. Даже на синьор собеседованиях для разогрева.
@user-ot5tx2oj6l
@user-ot5tx2oj6l 2 года назад
ну че народ погнали function sc(scob){ let i = 0 scob = scob.split('') while (scob.length>0){ console.log(scob) if(scob[i] == ')'){ // вычисляет первую закрывающуюся скобку if(scob[i-1] == '(') { //рядом с ней обязательно должна быть открывающая скобка scob.splice(i-1,2) //если это так удаляем эти скобки из массива i=0 // начинаем массив с начала continue // начинаем цикл с начала } else return false // если рядом с закрываеющейся скобочкой нет открывающийся значит все пропало } else if(scob[i] == '}'){ if(scob[i-1] == '{'){ scob.splice(i-1,2) i=0 continue } else return false } else if(scob[i] == ']'){ if(scob[i-1] == '['){ scob.splice(i-1,2) i=0 continue } else return false } else i++ } if(scob.length == 0) return true }
@user-ot5tx2oj6l
@user-ot5tx2oj6l 2 года назад
Уникальный самобытный код. Этот код как маньяк прыгает на тебя из-за угла с ножом)
@frontendscience
@frontendscience 2 года назад
Благодарю за решение! К сожалению на литкод оно не прошло - пишет Time Limit. исчерпал.
@user-ot5tx2oj6l
@user-ot5tx2oj6l 2 года назад
@@frontendscience let scob = '{{}' console.log(sc(scob)) function sc(scob){ let i = 0 scob = scob.split('') if(scob.length % 2) return false while (scob.length>0){ console.log(scob) if(scob[i] == ')'){ // вы числяет первую закрывающуюся скобку if(scob[i-1] == '(') { //рядом с ней обязательно должна быть открывающая скобка scob.splice(i-1,2) //если это так удаляем эти скобки из массива i=0 // начинаем массив с начала continue // начинаем цикл с начала } else return false // если рядом сзакрываеющийся скобочкой нет открывающийся значит все пропало } else if(scob[i] == '}'){ if(scob[i-1] == '{'){ scob.splice(i-1,2) i=0 continue } else return false } else if(scob[i] == ']'){ if(scob[i-1] == '['){ scob.splice(i-1,2) i=0 continue } else return false } else i++ } if(scob.length == 0) return true }
@evgeniichikishev2096
@evgeniichikishev2096 Год назад
function brackets(str) { let arr = str.split(''); const regEx = /(\[\]|\{\}|\(\))/; let start = []; let end = []; let index = 0; while(index >= 0) { index = str.search(regEx); start = arr.slice(0,index); end = arr.slice(index+2); arr = start.concat(end) str = arr.join(''); } return !Boolean(str); }
@evgeniichikishev2096
@evgeniichikishev2096 Год назад
так лучше function brackets(str) { const regEx = /(\[\]|\{\}|\(\))/; let index = 0; while (index !== -1) { index = str.search(regEx); str = str.substring(0, index) + str.substring(index + 2); } return !Boolean(str); }
@Giich
@Giich 2 года назад
Regexped my pc to death lol
@8_Artem_8
@8_Artem_8 2 года назад
Не самое оптимальное решение, но тоже имеет право на жизнь)) function check(str) { const checkStr = '[]{}()'; const bracketsStack = []; let bracket = 0; let bracketPosition = -1; for (let i = 0; bracket = str[i]; i++) { bracketPosition = checkStr.indexOf(bracket); if (bracketPosition === -1) { continue; } if (bracketPosition % 2 === 0) { bracketsStack.push(bracketPosition + 1); } else if (bracketsStack.pop() !== bracketPosition) { return false; } } return bracketsStack.length === 0; }
@frontendscience
@frontendscience 2 года назад
Благодарю за решение! Очень даже хорошее. "faster than 98.41% of JavaScript online submissions on LeetCode"
@arthurq7843
@arthurq7843 Год назад
Офигел с того, что метод pop() срабатывает даже находясь в условии… которое не выполняется!!! Это как так ваще!!!???)))))
@mihailgrinchenko814
@mihailgrinchenko814 2 года назад
function isValidJoke(str, prev = null) { str = str.replace("()", "").replace("[]", "",).replace("{}", ""); if (str.length > 0 && str.length !== prev) { prev = str.length; return isValidJoke(str, prev); } else { return !Boolean(str.length); } }
@frontendscience
@frontendscience 2 года назад
Благодарю за решение. Интересный вариант вышел
@nikitalugovykh
@nikitalugovykh 2 года назад
Оказалась не такой уж и сложной:) function checkValidBracketStr(strBracket) { let arr = strBracket.split(''); let prev = []; if(arr.length % 2 !== 0) return false; for (let k = 0; k < arr.length; k++) { let item = arr[k]; if (item === '[' || item === '{' || item === '(') { prev.push(item); continue; } if (getAccordanceBracket(prev[prev.length-1]) === item) { prev.pop(); continue }else { return false } } if (prev.length === 0) return true } function getAccordanceBracket(bracket){ switch (bracket) { case '{' : return '}'; case '[' : return ']' default : return ')' } }
@frontendscience
@frontendscience 2 года назад
Благодарю за решение!
@user-no7sl1yk3f
@user-no7sl1yk3f Месяц назад
Первый решение схоже с вашим не подсматривая. Спасибо function isValid(staples: string) { const stack = []; const mapStaples = { "(": ")", "[": "]", "{": "}", } function isOpening(staple) { return [...Object.keys(mapStaples)].includes(staple); } function isValidClosure(value: string, stapleOpening: string) { if (value === mapStaples[stapleOpening]) return true; return false }; for (const staple of staples) { if (isOpening(staple)) { stack.push(staple); continue; } else if (isValidClosure(staple, stack.at(-1))) { stack.pop(); } else { return false; } } return true; }
@olehkhashchevskyi6535
@olehkhashchevskyi6535 2 года назад
function validBraces(braces){ const re = /\(\)|\[\]|\{\}/; while(re.test(braces)) braces = braces.replace(re, ''); return !braces.length; }
@frontendscience
@frontendscience 2 года назад
Отличный вариант с replace вышел. Благодарю за решение.
@yuriydalekyy6453
@yuriydalekyy6453 2 года назад
function checker(str) { const obj = { "[": "]", "{": "}", "(": ")" }; const arr = []; for (let char of str) { if (arr.length === 0) { if (obj[char] === undefined) { return false; } else { arr.push(char); } } else { if (obj[char] !== undefined) { arr.push(char); } else if (char === obj[arr[arr.length - 1]]) { arr.pop(); } else { return false; } } } if (arr.length) return false; return
@user-uq7jo6tm8z
@user-uq7jo6tm8z 2 года назад
ааааа сложнаааа
@frontendscience
@frontendscience 2 года назад
Тренируйтесь! Потом будет легче!
@user-er3le7uo6v
@user-er3le7uo6v 2 года назад
У Вас очень интересные задачки и решения!) Мне друг недавно дал задачку написать функцию, которая принимает в качестве параметра неограниченное количество целых чисел, и возвращает их среднее арифмитическое(сумма делить на количество). Example: sumArgs(3,24,35,16,7) => 17 Которую решила так: function sumArgs() { return [...arguments].reduce((n, s) => n + s) / arguments.length; } Интересно Ваше мнение, может есть ещё какой-то интересный вариант😀
@thesunrock
@thesunrock 2 года назад
Лучше использовать rest-парамерты, чтобы "собрать" неограниченное число аргументов: developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Functions/rest_parameters Так рекомендуют на MDN, если вы пишите код для поддерживающих ES6+ браузеров или окружений: developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Functions/arguments#description Позвольте также дать вам несколько рекомендаций: 1. Функция вычисляет среднее арифметическое, так и называйте ее - average. 2. Входные данные можно проверять: вдруг в функцию передали не тот тип аргументов или вызвали без них? На заметку: reduce принимает два аргумента - функцию и начальное значение-аккумулятор. Если второе опускается, то им становится значение первого элемента массива. Без проверки входящих данных выглядит близко к вашему варианту: function average1(...nums) { return nums.reduce((n, s) => n + s, 0) / nums.length; } Можно использовать стрелочную функцию: const average2 = (...nums) => (nums.reduce((n, s) => n + s, 0) / nums.length); Интересным вариантом будет разбить функции на несколько, но тогда, чтобы добиться желаемого вами результата, придется их композировать. Зато это позволить переиспользовать каждую в отдельности, а так же композировать их с другими, не имеющими дела к вашей текущей задаче функциями. Пример ручной композиции: const sum = nums => nums.reduce((s, n) => s += n, 0); const length = items => items.length; const average = (...nums) => (sum(nums) / length(nums)); Добра-удачи.
@frontendscience
@frontendscience 2 года назад
@Юля Иванова Тут уже @Eugene E все отлично расписал. я бы тоже предложил использовать rest оператор (...args)
@user-er3le7uo6v
@user-er3le7uo6v 2 года назад
@@thesunrock спасибо большое, буду знать)
@melitopol_Russia
@melitopol_Russia 2 года назад
@@thesunrock , псевдомассив argument тоже примет неограниченное количество аргументов, так что здесь нет никакой разницы
@user-fd5xl8nh1y
@user-fd5xl8nh1y 2 года назад
Немного мучений и вот мое решение: isValid = function(s) { let stack = []; let brackets = {'()':'','{}':'','[]':''}; for (let i = 0; i < s.length; i++) { if (s[i] + s[i + 1] in brackets) { i += 1; continue; } if (stack[stack.length - 1] + s[i] in brackets) { stack.pop(); continue; } stack.push(s[i]); } return !stack.length; }
@frontendscience
@frontendscience 2 года назад
Благодарю за решение! 👍
Далее
Rare Mbappe Moments 🤯
00:21
Просмотров 1,5 млн
Two Sum | LeetCode 1 | JavaScript | Easy
13:20
Просмотров 6 тыс.
Git reset: difference between soft, mixed and hard
8:54
SQLite is not weakly typed!
5:56
Просмотров 1 тыс.