返回
前端开发修炼场—解析括号生成器,助你突破难题22
前端
2024-01-13 09:48:36
算法原理
括号生成器算法本质上是一种回溯算法,通过递归的方式生成所有可能的括号组合,然后逐个检查这些组合是否有效。算法的基本步骤如下:
- 定义一个辅助函数 generateParenthesis,该函数接受一个参数 n,表示要生成的括号对数。
- 在 generateParenthesis 函数中,使用递归的方式生成所有可能的括号组合。具体来说,对于每个括号对,可以有两种选择:左括号在前或右括号在前。因此,对于 n 个括号对,共有 2^n 种可能的组合。
- 对于生成的每一种组合,使用一个辅助函数 isValidParentheses 检查该组合是否有效。isValidParentheses 函数接受一个字符串参数,表示一个括号组合,并返回该组合是否有效。
- 将所有有效的括号组合收集起来,并返回。
JavaScript实现
/*
* 括号生成器算法
*
* @param {number} n 要生成的括号对数
* @return {string[]} 所有可能的有效括号组合
*/
function generateParenthesis(n) {
if (n <= 0) {
return [];
}
// 定义辅助函数 generateParenthesisHelper,用于递归生成括号组合
function generateParenthesisHelper(left, right, currentString) {
// 如果左括号和右括号都用完了,则返回当前字符串
if (left === 0 && right === 0) {
return [currentString];
}
// 如果左括号还有剩余,则可以将左括号添加到当前字符串中
if (left > 0) {
const newString = currentString + '(';
const result = generateParenthesisHelper(left - 1, right, newString);
return result;
}
// 如果右括号还有剩余,则可以将右括号添加到当前字符串中
if (right > 0) {
const newString = currentString + ')';
const result = generateParenthesisHelper(left, right - 1, newString);
return result;
}
// 如果既没有左括号也没有右括号了,则说明当前字符串无效,直接返回空数组
return [];
}
// 定义辅助函数 isValidParentheses,用于检查一个括号组合是否有效
function isValidParentheses(string) {
const stack = [];
for (const char of string) {
if (char === '(') {
stack.push('(');
} else if (char === ')') {
if (stack.length === 0) {
return false;
}
stack.pop();
}
}
return stack.length === 0;
}
// 生成所有可能的括号组合
const allCombinations = generateParenthesisHelper(n, n, '');
// 过滤无效的括号组合
const validCombinations = allCombinations.filter(isValidParentheses);
return validCombinations;
}
扩展阅读
总结
括号生成器算法是一种回溯算法,用于生成所有可能的有效括号组合。该算法通过递归的方式生成所有可能的括号组合,然后逐个检查这些组合是否有效。JavaScript实现代码提供了具体的实现细节,供读者参考。希望本文能够帮助你理解括号生成器算法的原理,并将其应用于实际编程中。