@campus1

Как проверить сбалансированность открывающих и закрывающих символов?

Надо написать функцию, проверяющую сбалансированность строки. Предоставлена строка для проверки и вторая строка, где каждая пара символов определяет последовательность открытия и закрытия, которая требует балансировки.

Решил я так => Code

Но недостатком есть то, что я никак не использую второй параметр (точнее не знаю, как его можно задействовать). Где и как его можно заюзать?
  • Вопрос задан
  • 325 просмотров
Решения вопроса 2
wataru
@wataru Куратор тега Алгоритмы
Разработчик на С++, экс-олимпиадник.
Правильное решение такой обощенной задачи - использовать стек.

Надо первую строку обработать последовательно, символ за символом. При получении открывающего символа в строке надо его положить в стек. При получении закрывающего символа - надо проверить, что на вершине стека лежит правильный открывающий символ и удалить его из стека. В конце надо проверить, что стек пуст. Если стек не пуст в конце, или где-то в процессе работы в стеке был не тот символ - строка не сбалансированна.

Для удобства реализации из второго параметра нужно выделить "открывающие" и "закрывающие" символы. Удобно в массиве из 256 элементов пометить все открывающие как-то (например, -1), Все закрывающие надо пометить номером соответствующего открывающиего символа. Т.е. для второго параметра "()[]". Для всех символов в массиве будет 0, но для '(' и '[' - будет -1. Для ')' будет в массиве хранится '(', а для ']' - '['.

Тогда, при обработке символа из первой строки, если в массиве для него 0, то просто пропускаем. Если -1 - то кладем в стек. Если что-то другое, то проверяем, что это значение лежит в стеке на вершине.

Ваше решение по ссылке на работает на тесте "())("
Ответ написан
Комментировать
@eGenius18
я на codewars решал так) ессесно можно расширить под любые скобки

function validBraces(b){
  let reg = /\(\)/g;
  b = b.replace(/[^\(\)]/g,'')
  
  return b.match(reg) != null ? validBraces(b.replace(reg,'')) : b === "" ? true : false;
}

console.log(validBraces("(Sensei saysno) (sd) (sdfsf"));
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
t-alexashka
@t-alexashka
Сразу пишу legacy код
Я так понимаю это задачка на завершенность скобочной последовательности. Решение не напишу, т.к. некогда, но идею подскажу.
Вам нужно завести 2 переменные для каждого типа скобок (квадратные,круглые)
var _square, _circle = 0;
после чего пробежаться циклом по каждому символу в строке, и если встречается:
[ то _square++
] то _square--
( то _circle++
) то _circle--


соотвественно если после цикла у вас _square и _circle равны нулю - то скобки закрыты правильно, что собственно и проверяете:
return !(_square || _circle);
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
26 нояб. 2024, в 21:30
30000 руб./за проект
26 нояб. 2024, в 20:38
120000 руб./за проект
26 нояб. 2024, в 20:08
1000 руб./за проект