返回

用 JavaScript 巧解 LeetCode 第 844 题:包含退格的字符串

前端

在竞争激烈的编程世界中,算法和数据结构的掌握至关重要。LeetCode 作为程序员磨砺技艺的殿堂,提供了丰富且具有挑战性的题目。第 844 题,一个看似简单却蕴含巧妙的字符串处理问题,吸引了广大程序员的关注。这道题旨在考验我们对栈数据结构的灵活应用和对字符串操作的细致理解。

问题陈述

给定一个字符串 s,该字符串由小写英文字母和特殊字符 # 构成。特殊字符 # 表示字符串中前一个字符的删除操作。你的任务是编写一个 JavaScript 函数,返回删除所有有效删除操作后的最终字符串。

例如,对于字符串 s = "ab#c", 最终字符串为 "bc" 因为字符 # 将字符 a 删除。

解决思路

解决这道题的关键是利用栈数据结构。栈遵循 "后进先出" (LIFO) 原则,即最后添加的元素将首先被移除。这种特性非常适合处理包含退格字符的字符串。

我们的算法步骤如下:

  1. 使用一个栈来存储字符。
  2. 遍历输入字符串 s
  3. 当遇到非 # 字符时,将其推入栈中。
  4. 当遇到 # 字符时,从栈中弹出最后一个字符(有效删除)。
  5. 遍历完成,将栈中剩余字符按顺序连接成最终字符串。

JavaScript 实现

function backspaceStringCompare(s) {
  let stack = [];

  // 遍历输入字符串
  for (let i = 0; i < s.length; i++) {
    // 非 # 字符入栈
    if (s[i] !== '#') {
      stack.push(s[i]);
    } else if (stack.length > 0) {
      // # 字符时,出栈
      stack.pop();
    }
  }

  // 返回最终字符串
  return stack.join('');
}

用例

下面是一些用例来展示函数的功能:

console.log(backspaceStringCompare('ab#c')); // 输出: "bc"
console.log(backspaceStringCompare('a#bc#')); // 输出: "a"
console.log(backspaceStringCompare('a#bb##')); // 输出: ""
console.log(backspaceStringCompare('##########')); // 输出: ""

结论

通过巧妙地使用栈数据结构,我们高效地解决了 LeetCode 第 844 题。这个算法展示了栈在处理包含退格字符的字符串中的重要性,也彰显了 JavaScript 作为一门灵活且功能全面的编程语言的魅力。

在算法和数据结构的学习道路上,不断探索和实战是提升自我的必由之径。LeetCode 这样的平台提供了绝佳的磨砺机会,它不仅考验我们的编码能力,更激发我们对编程的热爱。