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

Привет, друзья!
Сегодня решаем с вами задачу про правильную последовательность скобочек. Это очень известная и очень популярная задача на 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

Пікірлер: 191

  • @Zavyalovvvvv
    @Zavyalovvvvv3 жыл бұрын

    да, про стэк было бы полезно послушать... Заранее спасибо!

  • @frontendscience

    @frontendscience

    3 жыл бұрын

    И Вам. спасибо! Будет, значит)

  • @alchemynotes
    @alchemynotes3 жыл бұрын

    Блин, я как раз в прошлом месяце искала такой видос :( И нашла только какой-то шестилетней давности :( Спасибо! Полезно! И монтаж такой клевый, каждый раз приятно удивляюсь :3

  • @frontendscience

    @frontendscience

    3 жыл бұрын

    Спасибо большое! Рад, что понравилось и что полезно!

  • @romanryaboshtan9270
    @romanryaboshtan92702 жыл бұрын

    У человека удивительный талант учить, понятно показывать, я такого ещё не видел

  • @frontendscience

    @frontendscience

    2 жыл бұрын

    Рад, что было Вам полезно. Благодарю

  • @falconeye4172
    @falconeye41723 жыл бұрын

    Thank you so much Sergey for your work! Would be great to watch your video about different data structures.

  • @frontendscience

    @frontendscience

    3 жыл бұрын

    Thank you for watching! Got it)

  • @pavelgonzales_
    @pavelgonzales_2 жыл бұрын

    Дай бог тебе здоровья, Сережа ))))

  • @user-xt9nl7no8e
    @user-xt9nl7no8e2 жыл бұрын

    Варіант автора відео найвигідніший, найпростіший, найкоротший, на те він і наш вчитель з великим досвідом)

  • @ggaltqq
    @ggaltqq3 жыл бұрын

    Где-то читал( уже не вспомню) , что в именованиях лучше не использовать прошедшее время( если только домен этого не требует). И фонетически "isClosingBracket" звучит лучше. И спасибо за видосы)

  • @SiniyPetr
    @SiniyPetr2 жыл бұрын

    так просто, чтобы было, тоже свое решение оставлю) function isValidString(str){ let tempStr = str; let spliters = ['()', '[]' , '{}']; for (let i = 0 ; 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-lt4op2rf3w
    @user-lt4op2rf3w2 жыл бұрын

    Уже пятый день бьюсь над задачей, прохожу на Хекслет курс фронтенд разработчика и мы ещё не дошли до мап, предлагают решить задачу через две константы с открывающимися и закрывающимися скобками через indexOf Видео очень доступно обьяснило мне ход решения, мне было и так все понятно, но как сравнить скобки без обьекта до сих пор не понял, но обязательно дойду к этому. Спасибо, отлично делаете свое дело, удачи вам!

  • @frontendscience

    @frontendscience

    2 жыл бұрын

    Рад что было полезно. Что касается варианта без объекта, то нужно создать 2 переменные ‘({[‘ и ‘)}]’ теперь с помощью indexOf в первой ищем текущую скобку и проверяем чтобы закрывающаяся была равна скобке с тем же индексом но во второй переменной

  • @user-hk6bu5wc1d
    @user-hk6bu5wc1d2 жыл бұрын

    Данную задачу уже во второй раз встречаю за свою еще даже не начавшуюся карьеру. Видимо любят ее задавать

  • @lolitamalinovskaya5006
    @lolitamalinovskaya50063 жыл бұрын

    Спасибо Вам! Очень познавательно!)

  • @frontendscience

    @frontendscience

    3 жыл бұрын

    И Вам спасибо! Рад, что оказалось полезно)

  • @iOS1927
    @iOS19274 ай бұрын

    Четкий мужик! Большое спасибо 👍👍

  • @keiVision
    @keiVision3 жыл бұрын

    Больше задач БОЛЬШЕЕЕЕ

  • @nikitafamily5341
    @nikitafamily5341 Жыл бұрын

    Красивое решение через словарь!

  • @user-vt7ih2wr1d
    @user-vt7ih2wr1d Жыл бұрын

    Спасибо, хорошее объяснение :)

  • @murcha5899
    @murcha5899 Жыл бұрын

    хороший канал. приятное объяснение.

  • @user-up9zq1nw4n
    @user-up9zq1nw4n2 жыл бұрын

    Спасибо большое!

  • @_alexanderd
    @_alexanderd2 жыл бұрын

    Решил на php за 15 мин где-то через рекурсивный проход. В самом начале сделал проверку на четность кол-ва скобочек, чтобы сразу отсеять невалид. Решение через стек элегантнее конечно, т.к. нет необходимости обрабатывать всю строку.

  • @alexandervoievodin6913
    @alexandervoievodin69133 жыл бұрын

    Спасибо за видео! Немного изменил код, кому как больше по вкусу. 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

    3 жыл бұрын

    Благодарю за решение! Класс!

  • @alexandervoievodin6913

    @alexandervoievodin6913

    3 жыл бұрын

    @@frontendscience Это Вам спасибо за качественный контент, Сергей!)

  • @yohanson555

    @yohanson555

    3 жыл бұрын

    `current in brackets` - элегантно

  • @alexandervoievodin6913

    @alexandervoievodin6913

    3 жыл бұрын

    @@yohanson555 спасибо, приятно)

  • @SerzhNesteruk
    @SerzhNesteruk Жыл бұрын

    Спасибо за видео и интересную задачу! Решение почти полностью совпало с моим (даже нейминг), только цикл в другую сторону. 🙂 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

    Жыл бұрын

    Вот ещё альтернативное решение: const isValidBracketSequence = str => { const closedBrackets = /\(\)|\[\]|\{\}/g; while (str.match(closedBrackets)) { str = str.replace(closedBrackets, ''); } return str.length === 0; };

  • @denisvolkov4784
    @denisvolkov47842 жыл бұрын

    На середине 5й минуты я почувствовал себя ребёнком, почти в ладоши начал хлопать, а потом вспомнил что 20минут первого, а завтра(фактически сегодня уже, блин) четверг :( з.ы. Видео класс, впрочем как и всегда.

  • @alenachuyankova
    @alenachuyankova Жыл бұрын

    Круто!

  • @anastasiyaboiko8862
    @anastasiyaboiko88622 жыл бұрын

    Божечки как ясно-понятно, прям для таких как я :D Спасибо!

  • @frontendscience

    @frontendscience

    2 жыл бұрын

    Спасибо за поддержку! Очен рад, что было полезно :)

  • @eeonelix2681
    @eeonelix26813 жыл бұрын

    Только вчера решил такую задачу на codewars)

  • @user-ej2nb7yt9k
    @user-ej2nb7yt9k2 жыл бұрын

    большое спасибо

  • @user-mn3ic2ct8d
    @user-mn3ic2ct8d3 жыл бұрын

    Даёшь стэк!!!

  • @user-vn9qk3eh6i
    @user-vn9qk3eh6i Жыл бұрын

    Thank's a greate solution!!

  • @charliebrown5554
    @charliebrown55542 жыл бұрын

    Спасибо большое за такое подробное разъяснение. Очень жаль, что вы прекратили выпускать видео на этом канале. Я вас прекрасно понимаю.

  • @dryrider3881
    @dryrider3881 Жыл бұрын

    А что если мы можем менять местами соседние скобки ({[ или)]}бесконечное количество раз? То есть ([) ] уже будет true так как можем поменять местами последние 2. Менять, например, ( и) не можем так как смотрят в разные стороны

  • @MrTheDanils
    @MrTheDanils9 ай бұрын

    Сергей, контент отличный! Единственный вот момент который смутил: то, что внутри цикла, есть indexof. В итоге данная реализация ведь O(n*n)? Либо я чего то не понимаю…

  • @yarik83men51
    @yarik83men512 жыл бұрын

    Спасибо за труды. Ваше решение на 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 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 if (c[i] == chr) return true; } return false; } }

  • @denyslinetskyi
    @denyslinetskyi2 жыл бұрын

    LeetCode или CodeWars - Что посоветуете для начинающих?)

  • @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]

  • @lu4nik440
    @lu4nik4403 жыл бұрын

    Интересное решение но не был рассмотрен кейс, если строка начинается с закрывающей скобки или количество закрывающих скобок превышает количество открывающих, тогда мы вызываем метод pop() из пустого стэка, что может вызывать ошибки.

  • @frontendscience

    @frontendscience

    3 жыл бұрын

    Ошибки не будет. [].pop() возвращает undefined. Дальше будет сравниваться скобка с undefined что будет возвращать false так как последовательность не валидна.

  • @lu4nik440

    @lu4nik440

    3 жыл бұрын

    @@frontendscience Я имел ввиду ошибки в других языках, забыл дописать. Я сам с JS очень поверхностно знаком, поэтому не знал как в нем будет) Спасибо за объяснение!

  • @user-eo2xm4xc8s
    @user-eo2xm4xc8s3 жыл бұрын

    Снимите видео про стек!

  • @frontendscience

    @frontendscience

    3 жыл бұрын

    Обязательно будет

  • @koryunsahakyan-kb1tn
    @koryunsahakyan-kb1tn Жыл бұрын

    если на 20 строке в блоке if у тебя стейк пустой как ты сделаеш pop

  • @Parcker13
    @Parcker132 жыл бұрын

    На codwars наткнулся на эту задачу, а сегодня случайно здесь увидел.

  • @frontendscience

    @frontendscience

    2 жыл бұрын

    Хорошо отработал алгоритм ютуба! ))) В современном мире не поймешь - то ли везде знаки, то ли хорошо настроенный таргетинг)

  • @Rogov_Oleg
    @Rogov_Oleg2 жыл бұрын

    Хорошая задача. На первом собеседовании в жизни решил на Паскаль в 2007. Если человек не понимает стек и рекурсию - это не программист.

  • @dmytrokoka3796
    @dmytrokoka37962 жыл бұрын

    А можно про стек если видео уже конечно вышло, то кинуть ссылку, мелочь, а приятно!)

  • @frontendscience

    @frontendscience

    2 жыл бұрын

    В ближайших планах. Stay tuned!

  • @andreibudnik7435
    @andreibudnik74354 ай бұрын

    Занимаюсь недавно. Сделал без использования объектов. Не знал про понятие "стека". Использовал только 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 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; } }

  • @daniilzotov6982
    @daniilzotov69822 жыл бұрын

    мне кажется без стека вполне можно обойтись : алгоритм простой - следующая скобка является ли закрывающей - да - вырежи их и проверь еще раз предыдущую 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 жыл бұрын

    Благодарю за решение. Да такой вариант тоже имеет место быть - но он более "жадный" к памяти.

  • @gorshenkodenis6091
    @gorshenkodenis60912 жыл бұрын

    немогу врубиться ы это строку 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 как результат работы программы

  • @gl2949
    @gl29492 жыл бұрын

    А почему происходит так, что stack.pop удаляет элемент, когда мы по сути берем его только для сравнения в if?

  • @UC1C0GDMTjasAdhELHZ6lZNg

    @UC1C0GDMTjasAdhELHZ6lZNg

    Жыл бұрын

    так работает метод pop, неважно сравниваешь ли ты или делаешь что-либо другое. Если он вызван он вернет последний элемент и удалит его из массива.

  • @n.anoshin
    @n.anoshin2 жыл бұрын

    Лучше проверку на длину сделать в начале, если длина не является валидной (3, 5, 7, ... etc.), то делаем ретерн и все, чтобы не прогонять код и делать проверку в конце

  • @frontendscience

    @frontendscience

    2 жыл бұрын

    ну проверку на длину оставшегося стека в конце надо делать все равно будет, без относительно проверки на четность.

  • @commenterwebsite1695
    @commenterwebsite16952 жыл бұрын

    Не проще просто кидать в массив пару значений, а потом сравнить, если два значения то Валид если 1, то нет?

  • @frontendscience

    @frontendscience

    2 жыл бұрын

    Пришлите решение, плиз.

  • @evgeniychip
    @evgeniychip3 жыл бұрын

    тоже на эту задачу натыкался

  • @frontendscience

    @frontendscience

    3 жыл бұрын

    Да, она достаточно распространенная.

  • @ShulV
    @ShulV2 жыл бұрын

    Объясните, пожалуйста, почему этот алгоритм является рекурсивным? Насколько мне известно, рекурсия в программировании - это вызов функцией самой себя. В данном коде такого нет, так в чём же заключается рекурсия?

  • @frontendscience

    @frontendscience

    2 жыл бұрын

    Алгоритм который был реализован в видео не рекурсивный. Я упомянул что мы можем решить задачу рекурсивно выкусывая все пары скобочек. до тех пор пока есть что выкусывать. В этом случае функция ищет и удаляет все рядом стоящие пары скобок. И мы будем оставшуюся строку еще раз скармливать этой функции. Будет рекурсивное решение. Вариант же предложенный в видео более эффективен - работает линейно - и за один проход определяет валидность строки.

  • @ShulV

    @ShulV

    2 жыл бұрын

    @@frontendscience Спасибо!

  • @f50ciety
    @f50ciety2 жыл бұрын

    блин) а если решил после объяснения алгоритма, без подсматривания в ваш код, считается?)

  • @frontendscience

    @frontendscience

    2 жыл бұрын

    Конечно! Решение задачи складывается из 2 частей - разобраться в том, каким алгоритмом ты это будешь решать, и потом все запрограммировать. Я видел очень много разработчиков, которые на собеседовании рассказывали правильно алгоритм, но не могли это запрограммировать. Так что половина работы уже есть! А определение нужного алгоритма придет с практикой ;) успехов!

  • @f50ciety

    @f50ciety

    2 жыл бұрын

    @@frontendscience спасибо)) и вам)

  • @HunterForAdventure
    @HunterForAdventure3 жыл бұрын

    Спасибо за видео, мое решение: var isValid = function(s) { const map = {'(':')', '{':'}', '[':']'}; const arr = []; for (let i = 0; i 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

    3 жыл бұрын

    Благодарю! Классное решение!

  • @EvilYou
    @EvilYou3 жыл бұрын

    Решал раньше такую задачу на 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 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

    3 жыл бұрын

    Благодарю за варианты решения!

  • @EvilYou

    @EvilYou

    11 ай бұрын

    function isValid(s) { let arr = s.split(''); let obj = { '[': ']', '{': '}', '(': ')', }; for (let i = 0; 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. решение через стек, конечно, лучше для больших строк

  • @oleksandrzz
    @oleksandrzz2 жыл бұрын

    спасибо за контент =) перед решением случайно на глаза попал самый верхний комментарий, где что-то писали про стек и это стало хорошим спойлером решения) время 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; }

  • @timchenkod88
    @timchenkod882 жыл бұрын

    Про стек дуже цікаво було б, не знайшов у Вас на каналі відео про стек.

  • @kuzm1ns
    @kuzm1ns2 жыл бұрын

    Спасибо! Подсмотрел алгоритм решения в общем виде и написал своё: 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 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; };

  • @user-nu7it3ez4b
    @user-nu7it3ez4b3 жыл бұрын

    А если строка начинается с закрытой скобки?)

  • @frontendscience

    @frontendscience

    3 жыл бұрын

    Это тоже невалидная последовательность. Алгоритм отработает правильно и сделает проверку на первом же символе. У нас будет пустой стек и закрывающуюся скобку не с чем будет сравнивать. Поэтому алгоритм вернет false.

  • @VoCs1000
    @VoCs10002 жыл бұрын

    Нельзя ли использовать includes вместо indexOf ?

  • @frontendscience

    @frontendscience

    2 жыл бұрын

    Можно. Это я по привычке

  • @alexey_n.

    @alexey_n.

    Жыл бұрын

    @@frontendscience было больно, когда это увидел

  • @squabble3332
    @squabble3332 Жыл бұрын

    решал похожее сделал функцию на удаление из строки () [] и тд потом проверял есть ли еще такие в строке и удалял еще раз и так по кругу в цикле -) суть проверки в том что у вас всегда будет скобки которые открываются и закрываются сразу же, поэтому если таких нет, то строка с ошибкой ну и в конце если строка стала пустой то все четко, если нет то опять же ошибка

  • @Ramosok
    @Ramosok4 ай бұрын

  • @dzmitry.maslau
    @dzmitry.maslau3 жыл бұрын

    Привет! А разве Stack это FILO, а не LIFO?)

  • @frontendscience

    @frontendscience

    3 жыл бұрын

    я думаю тут разницы нет - главное консистентность с другими структурами (по типу очереди)

  • @dzmitry.maslau

    @dzmitry.maslau

    3 жыл бұрын

    ​@@frontendscience Соглашусь, это уже мелочи! В любом случае, спасибо за твои видео, и то что ты делаешь! У тебя отличный контент и очень крутое качество монтажа и съёмки!

  • @webdeveloper5770
    @webdeveloper57703 күн бұрын

    Это реально самому решить если не смотреть инструкцию? Прям на интервью. Скорее это проверка на "Ах он негодяй, даже к интервью не подготовился"

  • @mykhailonikolaiev6512
    @mykhailonikolaiev65123 жыл бұрын

    мне такие задачки на codewars попадаются))на 5 kyu

  • @frontendscience

    @frontendscience

    3 жыл бұрын

    Так делитесь решениями! Всем будет полезно.

  • @alexkardone3809
    @alexkardone38092 жыл бұрын

    Ну, часа полтора точно просидел над ней. Вот мое решение: 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 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
    @armanghazaryan17482 жыл бұрын

    пол часа потратил но по моему не плохой вариант )) 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; }

  • @igorekupaev1134
    @igorekupaev11342 жыл бұрын

    Что думаете по поводу такого решения? function isBracketsValid (str) { for (let i = 0; i

  • @pavelnenashev4353

    @pavelnenashev4353

    Жыл бұрын

    такое есть на leetcode, работает в полтора раза медленней

  • @user-iw4nw9xm8c
    @user-iw4nw9xm8c Жыл бұрын

    у меня двойным циклом получилось) function isValid1(s) { s = s.split("", s.length) let keys = { "()": "()", "[]": "[]", "{}": "{}" } for (let i = 0; i if(keys[s[i] + s[i + 1]]){ for(let j = 0; j s.splice(i, 2) i = 0 j = 0 } } } return s.length > 0 ? false : true }

  • @user-ot5tx2oj6l
    @user-ot5tx2oj6l2 жыл бұрын

    ну че народ погнали 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 }

  • @user-er3le7uo6v
    @user-er3le7uo6v3 жыл бұрын

    У Вас очень интересные задачки и решения!) Мне друг недавно дал задачку написать функцию, которая принимает в качестве параметра неограниченное количество целых чисел, и возвращает их среднее арифмитическое(сумма делить на количество). Example: sumArgs(3,24,35,16,7) => 17 Которую решила так: function sumArgs() { return [...arguments].reduce((n, s) => n + s) / arguments.length; } Интересно Ваше мнение, может есть ещё какой-то интересный вариант😀

  • @thesunrock

    @thesunrock

    3 жыл бұрын

    Лучше использовать 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

    3 жыл бұрын

    @Юля Иванова Тут уже @Eugene E все отлично расписал. я бы тоже предложил использовать rest оператор (...args)

  • @user-er3le7uo6v

    @user-er3le7uo6v

    3 жыл бұрын

    @@thesunrock спасибо большое, буду знать)

  • @melitopol_Russia

    @melitopol_Russia

    3 жыл бұрын

    @@thesunrock , псевдомассив argument тоже примет неограниченное количество аргументов, так что здесь нет никакой разницы

  • @bekzodbekolimbekov5964
    @bekzodbekolimbekov59643 жыл бұрын

    такого рода задачи будут даны junior деволоперам

  • @frontendscience

    @frontendscience

    3 жыл бұрын

    Я думаю, что такая задача вполне может встретиться на любом уровне. Даже на синьор собеседованиях для разогрева.

  • @arthurq7843
    @arthurq7843 Жыл бұрын

    Офигел с того, что метод pop() срабатывает даже находясь в условии… которое не выполняется!!! Это как так ваще!!!???)))))

  • @8_Artem_8
    @8_Artem_83 жыл бұрын

    Не самое оптимальное решение, но тоже имеет право на жизнь)) 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

    3 жыл бұрын

    Благодарю за решение! Очень даже хорошее. "faster than 98.41% of JavaScript online submissions on LeetCode"

  • @Giich
    @Giich2 жыл бұрын

    Regexped my pc to death lol

  • @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); }

  • @mihailgrinchenko814
    @mihailgrinchenko8142 жыл бұрын

    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
    @nikitalugovykh3 жыл бұрын

    Оказалась не такой уж и сложной:) function checkValidBracketStr(strBracket) { let arr = strBracket.split(''); let prev = []; if(arr.length % 2 !== 0) return false; for (let k = 0; 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

    3 жыл бұрын

    Благодарю за решение!

  • @user-no7sl1yk3f
    @user-no7sl1yk3f2 ай бұрын

    Первый решение схоже с вашим не подсматривая. Спасибо 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
    @olehkhashchevskyi65352 жыл бұрын

    function validBraces(braces){ const re = /\(\)|\[\]|\{\}/; while(re.test(braces)) braces = braces.replace(re, ''); return !braces.length; }

  • @frontendscience

    @frontendscience

    2 жыл бұрын

    Отличный вариант с replace вышел. Благодарю за решение.

  • @user-uq7jo6tm8z
    @user-uq7jo6tm8z3 жыл бұрын

    ааааа сложнаааа

  • @frontendscience

    @frontendscience

    3 жыл бұрын

    Тренируйтесь! Потом будет легче!

  • @yuriydalekyy6453
    @yuriydalekyy64532 жыл бұрын

    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-fd5xl8nh1y
    @user-fd5xl8nh1y3 жыл бұрын

    Немного мучений и вот мое решение: isValid = function(s) { let stack = []; let brackets = {'()':'','{}':'','[]':''}; for (let i = 0; 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

    3 жыл бұрын

    Благодарю за решение! 👍