以下为ChatGPT自动生成的解答,正确与否请自行判断。
BFE.devAI解答 - JavaScript 代码题
102. 验证括号字符串
一种解法是使用栈(stack)数据结构来处理括号匹配。遍历字符串,如果当前字符是左括号,就将其压入栈中;如果是右括号,就将栈顶元素弹出,检查是否与当前右括号匹配。如果配对成功,继续遍历;如果失败,说明括号顺序不对或者不配对,直接返回 false。
时间复杂度为 O(n),其中 n 是字符串的长度,因为每个字符只需要遍历一遍。空间复杂度也是 O(n),因为需要使用一个栈来保存左括号。
代码示例:
function validate(str) {
const stack = [];
const bracketsMap = {
'(': ')',
'[': ']',
'{': '}',
};
for (let s of str) {
if (s in bracketsMap) {
stack.push(s); // 左括号入栈
} else {
const left = stack.pop(); // 栈顶元素出栈
if (!left || bracketsMap[left] !== s) { // 括号配对失败
return false;
}
}
}
return stack.length === 0; // 栈为空说明所有左括号都匹配了
}
可以看到,在配对失败后直接返回 false,避免了继续遍历的开销,最坏情况下空间复杂度是 O(n/2)。代码中使用了 ES6 中的 for...of 语法,以及关系运算符 in 来判断是否为左括号。
还有一种使用正则表达式匹配的解法,不过时间复杂度较高。可以参考下面的代码,它先将字符串中所有括号匹配的部分用空字符串替换,直到不能再匹配为止。如果最终字符串为空,说明所有括号都配对成功,否则说明有未配对的括号。
function validate(str) {
const reg = /\(\)|\[\]|\{\}/;
while (str.match(reg)) {
str = str.replace(reg, '');
}
return str.length === 0;
}
这种方法的时间复杂度最坏情况下是 O(n^2),因为每次用正则表达式替换都需要遍历一遍字符串。空间复杂度是 O(n),因为需要复制新的字符串进行替换。不过这种解法写起来简单,而且对于简单的字符串可以快速判断。