我的 leetcode 刷题记录--字符串解码

607 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第4天,点击查看活动详情

字符串解码

题目链接:字符串解码

题目描述:给定一个经过编码的字符串,返回它解码后的字符串。

编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。

你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。

此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k,例如不会出现像 3a 或 2[4] 的输入。

示例1:

输入: s = "3[a]2[bc]"
输出: "aaabcbc"

示例2:

输入: s = "3[a2[c]]"
输出: "accaccacc"

示例3:

输入: s = "2[abc]3[cd]ef"
输出: "abcabccdcdcdef"

示例4:

输入: s = "abc3[cd]xyz"
输出: "abccdcdcdxyz"

解题思路

辅助栈法

本题的难点在于括号内嵌套括号,需要从内向外生成和拼接字符串,这与栈的后进先出特性相对应。

  1. 创建辅助栈 strStacknumStack,分别用来存放字符和数字

  2. 遍历每个字符 char,若 char 为数字,则转化为 num,用于后续的倍数计算,若 char 为字母,则拼接到 res 后面

  3. char[ 时,将 resnum 入栈,并分别置空

  4. char] 时,将 numres 出栈,并进行拼接

  5. 最后将拼接好的 res 返回

需要注意的地方:判断单个字符是否为数字,使用 isNaN(char)isNaN(char)false 时,说明字符为数字;在进行字符串的拼接时,使用 repeat 方法,传入的参数是出栈的 num,表示重复的次数。

题解

/**
 * @param {string} s
 * @return {string}
 */
var decodeString = function(s) {
  let numStack = [];
  let strStack = [];
  let num = 0;
  let res = '';
  
  for (let char of s) {
    if (!isNaN(char)) {  // 如果 char 为数字
      num = num * 10 + Number(char);
    } else if (char === '[') {  // 遇到 [ 进栈
      strStack.push(res);
      res = '';
      numStack.push(num);
      num = 0;
    } else if (char === ']') {  // 遇到 ] 出栈
      let repeatTimes = numStack.pop();  // 重复次数
      res = strStack.pop() + res.repeat(repeatTimes);  // 拼接字符串
    } else {
      res += char;
    }
  }
  
  return res;
};

总结

此篇文章记录了笔者在 leetcode 刷题时的一些思考,在遇到字符串中有数字和字母时,使用辅助栈可以帮助我们分类存放字符,以便于后续的操作(例如拼接),希望此文章能够为大家提供一些帮助,如有不足欢迎大家指正。谢谢!