LeetCode HOT 100 —— 394. 字符串解码

92 阅读2分钟

LeetCode HOT 100 —— 394. 字符串解码

辅助栈 中等

题目描述

给定一个经过编码的字符串,返回它解码后的字符串。

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

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

此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a2[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"
    

解题思路

字符串内可能出现 数字字母[]

数字:用于重复次数计算,如果出现连续数字需要处理。

字母:延长字符串

左括号:当前状态入栈

右括号:弹出状态,组合字符串

解题代码

var decodeString = function(s) {
  const arr = [] // 栈
  let res = ''   // 字符串
  let multi = 0  // 重复次数
  for(let item of s) {
    // 判断当前字符是否为数字
    if(item < 48 || item > 57) {
      // 如果重复次数不为0,说明上一个字符仍是数字
      if(multi != 0) {
        multi = multi + item 
      } else {
        multi = item
      }
    } else if(item === '[') {
      arr.push([multi, res])	// 将重复次数和字符串组合放入栈内
      multi = 0
      res = ''
    } else if(item === ']') {
      const [num, str] = arr.pop()	// 弹出状态
      res = str + res.repeat(num)	  // 原字符串和组合后的字符串拼接 
    } else {
      // 字符处理,延长字符串
      res = res + item
    }
  }
  return res	// 返回结果
};

举例:这里使用 示例 1 这个例子

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

第一个字符为 3,它是数字,此时 multi = 3, res = ''

第二个字符为 [,它是左括号,将 [3, ''] 压入栈内,此时 multi = 0, res = ''

第三个字符为 a,它是字母,此时 multi = 0, res = 'a'

第四个字符为 ],它是右括号,弹出状态 num = 3, str = '',拼接后 multi = 0, res = '' + 'aaa' = 'aaa'

第五个字符为 2,它是数字,此时 multi = 2, res = 'aaa'

第六个字符为 [,它是左括号,将 [2, 'aaa'] 压入栈内,此时 multi = 0, res = ''

第七个字符为 b,它是字母,此时 multi = 0, res = 'b'

第八个字符为 c,它是字母,此时 multi = 0, res = 'bc'

第九个字符为 ],它是右括号,弹出状态 num = 2, str = 'aaa',拼接后 multi = 0, res = 'aaa' + 'bcbc' = 'aaabcbc'

* 栈内的 num 是下一个res重复的次数,str 是之前已经处理过的字符串