返回
JavaScript巧解LeetCode1249:从括号字符串移除无效括号
前端
2024-01-17 16:31:22
概览
在解决leetcode 1249 题目时,我们必须从给定的字符串 s 中,移除最少数量的无效括号,使之成为有效字符串。
算法详解
思路分析
要解决这个问题,我们可以运用栈这种数据结构来辅助我们进行括号匹配。我们从左到右遍历字符串,遇到左括号时将其压入栈中,遇到右括号时,若栈中存在左括号,则将两个括号均弹出栈外,表示该对括号已匹配成功;若栈中不存在左括号,则当前右括号无效,需要将其移除。
在遍历完整个字符串后,如果栈中仍然存在未匹配的左括号,则需要将它们全部移除。
实现细节
/**
* 移除无效括号,使其成为有效字符串
*
* @param {string} s 由'('、')'和小写字母组成的字符串
* @return {string} 移除无效括号后的字符串
*/
const minRemoveToMakeValid = (s) => {
const stack = [];
const indicesToRemove = [];
for (let i = 0; i < s.length; i++) {
const char = s[i];
if (char === '(') {
stack.push(i);
} else if (char === ')') {
if (stack.length > 0) {
stack.pop();
} else {
indicesToRemove.push(i);
}
}
}
while (stack.length > 0) {
indicesToRemove.push(stack.pop());
}
let result = '';
let index = 0;
for (let i = 0; i < s.length; i++) {
if (indicesToRemove.includes(i)) {
continue;
}
result += s[i];
}
return result;
};
实例
const s1 = '))((';
console.log(minRemoveToMakeValid(s1)); // "()"
const s2 = '())()(';
console.log(minRemoveToMakeValid(s2)); // "()()()"
const s3 = '((()))'
console.log(minRemoveToMakeValid(s3)); // "((()))"
const s4 = '())(()))('
console.log(minRemoveToMakeValid(s4)); // "()()()"
总结
本指南深入分析了解决leetcode 1249题目的思路和具体实现方法,并通过清晰的实例演示了如何巧妙地运用JavaScript中的栈和贪心算法来移除无效的括号。希望这篇指南能够帮助你轻松掌握这一技能,在编程实践中游刃有余。