Как определить правильность вложенности символов `()`, `[]`, `{}` в строке, как в примерах с переменными `str`, `str2`, `str3` и `str4`? Мне удается решить все случаи, кроме строки `((([])){})`. Как можно эффективно выполнить поиск и проверку такой вложенной структуры в строке? Можно ли улучшить решение, избегая рекурсивного использования `replace`? Ссылка на текущее решение помогла, но в поисках оптимального способа.
Для проверки правильности вложенности скобок можно использовать следующий подход:
1. Создать стек, в который будем помещать открывающие скобки.
2. Пройти по каждому символу в строке.
3. Если символ - открывающая скобка (`(`, `[`, `{`), поместить её в стек.
4. Если символ - закрывающая скобка (`)`, `]`, `}`), проверить, что она соответствует последней открывающей скобке в стеке. Если да, удалить последнюю открывающую скобку из стека и продолжить проверку. Если нет, значит скобки в строке расставлены неправильно.
5. После проверки всех символов в строке, проверить, что стек пуст. Если да, то вложенность скобок верна.
Пример кода на Python:
```python
def check_brackets(input_string):
stack = []
brackets_map = {
'(': ')',
'[': ']',
'{': '}'
}
for char in input_string:
if char in brackets_map:
stack.append(char)
elif char in brackets_map.values():
if not stack or brackets_map[stack.pop()] != char:
return False
return not stack
str = "((([])){}"
print(check_brackets(str)) # Выведет False
str2 = "([])"
print(check_brackets(str2)) # Выведет True
str3 = "({[]})"
print(check_brackets(str3)) # Выведет True
str4 = "({[})"
print(check_brackets(str4)) # Выведет False
```
Этот код эффективно проверяет правильность вложенности скобок в строке, используя стек для отслеживания открывающих скобок. Улучшить его можно, например, добавив дополнительную проверку на конец строки, чтобы исключить случаи, когда в строке больше открывающих, чем закрывающих скобок.
<pre><code class="javascript">/**
* @param {string} s
* @return {boolean}
*/
var isValid = function (s) {
//hash function for partheses
let map = { "}": "{", "]": "[", ")": "(" };
let temp = [];
//Iterates
for(i in s){
//if a index that matches a closing bracket - continue
if(s[i] in map){
//if the temp isn't empty, and the top of the stack is that closing bracket - pop it
if(temp.length > 0 && temp[temp.length-1] === map[s[i]]){
temp.pop();
}
//else we break it - return false
else{
return false;
}
}
//else we push the opening bracket onto the stack
else{
temp.push(s[i]);
}
}
//else we return true if the temp is empty
return temp.length === 0;
};</code></pre> <br/> <br/> Прямо в литкоде есть решения, можно открыть Solutions, отфильтровать по языку и читать с описанием, можно перейти к all submissions и выбрать самое быстрое решение.