Codewars - Баланс скобок - Javascript - PullRequest
0 голосов
/ 25 сентября 2019

Пытаясь решить этот вызов 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, ''); выдает?Я хотел бы оптимизировать.

1 Ответ

2 голосов
/ 25 сентября 2019

Более краткая альтернатива:

  1. Удалите все скобки со смежным совпадением, т. Е. "()".
  2. Повторяйте это, пока не останется больше.Это оставляет вам только непревзойденные скобки.
  3. Подсчитайте, сколько ) у вас в строке.Вот сколько ( вам нужно будет добавить в начало.
  4. Подсчитайте, сколько ( у вас в строке.Вот сколько ) вам нужно будет добавить в конец.

const fixParentheses = (str) => {
  let orig = str;

  //Repeatedly remove all instances of "()" until there are none left
  while (str.includes("()"))
    str = str.replace(/\(\)/g, '');
    
  //Count the number of ")" and "(" left in the string
  let amtOpeningParensNeeded = (str.match(/\)/g) || []).length;
  let amtClosingParensNeeded = (str.match(/\(/g) || []).length;
  
  //Add that many "(" and ")" to the string, respectively
  return "(".repeat(amtOpeningParensNeeded) + orig + ")".repeat(amtClosingParensNeeded);
};

//You can ignore this, it's just a wrapper for demo/logging purposes
const test = input => { console.log(`Input: ${input}`); console.log(`Output: ${fixParentheses(input)}`)};

test(")(");
test("))))(()(");

Почему я должен разделять мои методы массива на новые строки?Почему stack.push('(').push(')'.repeat(stack.length)).join().replace(/[,]/gi, ''); выдает ошибку?

Вы не можете связать дополнительные методы Array с .push(), потому что он не возвращает Array;он возвращает целое число , представляющее новый length массива .

Для всех намерений и целей ["apples","oranges"].push("banana").join() - это то же самое, что и 3.join().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...