Codewars - 平衡括号 - Javascript

试图解决这个代码战挑战:


您的工作是修复括号,以便所有左括号和右括号(括号)都有匹配的对应项。您将通过在字符串的开头或结尾附加括号来完成此操作。结果应该是最小长度。不要添加不必要的括号。


输入将是一个不同长度的字符串,只包含“(”和/或“)”。


例如:


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, '');呢?我想优化。


慕容森
浏览 132回答 1
1回答

BIG阳

一个更简洁的替代方案:删除具有相邻匹配项的所有括号,即"()"。重复这个直到没有更多。这让您只剩下不匹配的括号。计算)字符串中有多少。这是(您需要添加到开头的数量。计算(字符串中有多少。这是)您需要添加到最后的数量。const fixParentheses = (str) => {&nbsp; let orig = str;&nbsp; //Repeatedly remove all instances of "()" until there are none left&nbsp; while (str.includes("()"))&nbsp; &nbsp; str = str.replace(/\(\)/g, '');&nbsp; &nbsp;&nbsp;&nbsp; //Count the number of ")" and "(" left in the string&nbsp; let amtOpeningParensNeeded = (str.match(/\)/g) || []).length;&nbsp; let amtClosingParensNeeded = (str.match(/\(/g) || []).length;&nbsp;&nbsp;&nbsp; //Add that many "(" and ")" to the string, respectively&nbsp; return "(".repeat(amtOpeningParensNeeded) + orig + ")".repeat(amtClosingParensNeeded);};//You can ignore this, it's just a wrapper for demo/logging purposesconst 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().
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript