返回

JavaScript栈标准解法,深入剖析LeetCode 20题

前端

在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题“有效括号”是这一方法的经典应用实例,通过栈的应用,我们可以清晰地看到算法思想的简单性和实现细节的精妙之处。