Пытаясь решить этот вызов codewars :
Ваша задача состоит в том, чтобы исправить скобки так, чтобы все открывающие и закрывающие скобки (скобки) имели совпадающие аналоги.Вы сделаете это, добавив скобки в начало или конец строки.Результат должен быть минимальной длины.Не добавляйте ненужные круглые скобки.
На входе будет строка переменной длины, содержащая только «(» и / или «)».
Например:
Input: ")("
Output: "()()"
Input: "))))(()("
Output: "(((())))(()())"
Моя идея состоит в том, чтобы создать «стек», а затем поместить этот стек в окончательный массив, когда мы встретим «противоположные» скобки.
const fixParentheses = (str) => {
let array = Array.from(str);
let final = [];
let stack = [];
for (let j = 0; j < array.length; j++) {
if (array[j] === ')' && array[j + 1] === ')'){
stack.push(')');
}
if (array[j] === ')' && array[j + 1] === '(') {
stack.push(')');
stack.unshift('('.repeat(stack.length));
stack = stack.join();
stack = stack.replace(/[,]/gi, '');
final.push(stack);
stack = [];
}
if (array[j] === '(' && array[j + 1] === '(') {
stack.push('(');
}
if (array[j] === '(' && array[j + 1] === ')') {
stack.push('(');
stack.push(')'.repeat(stack.length));
stack = stack.join();
stack = stack.replace(/[,]/gi, '');
final.push(stack);
stack = [];
}
}
return final.join('');
}
console.log(fixParentheses('))))(()('));
Желаемый результат: '(((())))(()())'
Проблема в том, что это балансировка, но не в правильном порядке.
Я не знаю, как объяснить ситуации, в которых мы видим (()(
, без функции, которая становится слишком сложной (какой она уже является).
Кроме того, не могли бы вы объяснить мне, почему в настоящее время мне приходится разделять методы массива на отдельные строки?Т.е. почему
stack.push('(');
stack.push(')').repeat(stack.length));
stack = stack.join();
stack = stack.replace(/[,]/gi, '');
не выдает ошибку, а stack.push('(').push(')'.repeat(stack.length)).join().replace(/[,]/gi, '');
выдает?Я хотел бы оптимизировать.