返回
JavaScript栈标准解法,深入剖析LeetCode 20题
前端
2023-11-09 19:01:02
在LeetCode中,第20题“有效括号”是一个经典问题,旨在判断给定字符串中括号是否有效。而栈是一种遵循后进先出的原则的数据结构,在括号匹配问题中有着广泛的应用。因此,使用JavaScript中的栈数据结构来解决这一问题,不失为一种行之有效的方法。
一、算法思想:栈的应用
栈是一种遵循后进先出的原则的数据结构,具有“先进后出”的特性。在判断括号是否有效时,我们可以将左括号入栈,将右括号出栈,并比较两者是否匹配。如果栈在处理完整个字符串后为空,则说明所有括号都已正确配对,字符串有效;否则,字符串无效。
二、实现细节:JavaScript中的栈
在JavaScript中,我们可以使用数组来实现栈。具体实现如下:
class Stack {
constructor() {
this.items = [];
}
push(item) {
this.items.push(item);
}
pop() {
return this.items.pop();
}
peek() {
return this.items[this.items.length - 1];
}
isEmpty() {
return this.items.length === 0;
}
}
三、标准栈解法:代码实现
基于上述栈的实现,我们可以编写代码来解决LeetCode第20题:
/**
* 判断字符串中的括号是否有效
*
* @param {string} s 输入字符串
* @return {boolean} 括号是否有效
*/
const isValid = (s) => {
const stack = new Stack();
for (let i = 0; i < s.length; i++) {
const char = s[i];
if (char === '(' || char === '{' || char === '[') {
stack.push(char);
} else if (char === ')' || char === '}' || char === ']') {
const left = stack.pop();
if (left === '(' && char !== ')' ||
left === '{' && char !== '}' ||
left === '[' && char !== ']') {
return false;
}
}
}
return stack.isEmpty();
};
四、算法分析:时间复杂度和空间复杂度
对于给定长度为n的字符串,算法的时间复杂度和空间复杂度均为O(n)。这是因为栈中元素的入栈和出栈操作的时间复杂度均为O(1),而算法需要遍历字符串中的每个字符,因此总的时间复杂度为O(n)。同样,算法需要在栈中存储最多n个元素,因此空间复杂度也为O(n)。
五、总结
使用JavaScript栈来判断括号的有效性是一种简单易行的方法。栈的数据结构特性与括号匹配问题的天然契合,使得这种方法具有良好的性能和可扩展性。LeetCode第20题“有效括号”是这一方法的经典应用实例,通过栈的应用,我们可以清晰地看到算法思想的简单性和实现细节的精妙之处。