// 描述 // 给出一个正整数n,请给出所有的包含n个'('和n个')'的字符串,使得'('和')'可以完全匹配。 // 例如: // '(())()','()()()' 都是合法的; // '())()('是不合法的。 // 请按照__字典序__给出所有合法的字符串。 // 输入描述: // 输入为1个正整数 // 输出描述: // 输出为所有合法的字符串,用英文逗号隔开 // 示例1 // 输入: // 2 // 复制 // 输出: // (()),()() //算法不对 const rl = require("readline").createInterface({ input: process.stdin }); var iter = rl[Symbol.asyncIterator](); const readline = async () => (await iter.next()).value; void async function () { // Write your code here while(line = await readline()){ let n=Number(line)//n对括号 2n个括号 let res= growth(2*n) //console.log(res) let pt= res.filter(v=>check(v) ) console.log(pt.join(",")) } }() // 多情况递归 需要用数组 function growth(n){ let tmp=[] if(n==1){ tmp.push("(") tmp.push(")") } else if(n){ let pre=growth(n-1) pre.forEach(v=>{ tmp.push(v+"(") tmp.push(v+")") }) } return tmp } function check(str){ if(str==""){return false} let rt=0; for(let i=0;i<str.length;i++){ if(str[i]=="("){ rt++ }else if(str[i]==")"){ rt-- } if(rt<0){ return false;} //提前多出现) 报错 } if(rt==0){ return true;} //整好配对 else{ return false;} //左右不配对 }
遍历所有括号情况 n对括号就是2n个括号每个括号要么是'(' 要么是')' 罗列所有情况,然后利用过滤函数判断哪些是正确的括号序列。提前出线右括号是错误序列,匹配结束后左右括号个数不相等时错误序列