[JavaScript 刷题] 栈 - 字符串解码, leetcode 394

Posted GoldenaArcher

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[JavaScript 刷题] 栈 - 字符串解码, leetcode 394相关的知识,希望对你有一定的参考价值。

[javascript 刷题] 栈 - 字符串解码, leetcode 394

github repo 地址: https://github.com/GoldenaArcher/js_leetcode,Github 的目录 大概 会更新的更勤快一些。

题目地址:394. Decode String

题目

如下:

Given an encoded string, return its decoded string.

The encoding rule is: k[encoded_string], where the encoded_string inside the square brackets is being repeated exactly k times. Note that k is guaranteed to be a positive integer.

You may assume that the input string is always valid; there are no extra white spaces, square brackets are well-formed, etc. Furthermore, you may assume that the original data does not contain any digits and that digits are only for those repeat numbers, k. For example, there will not be input like 3a or 2[4].

The test cases are generated so that the length of the output will never exceed 10^5.

解题思路

解题的思路其实和 150, 逆波兰表达式求值 挺像的,这里依旧使用栈去解。

核心思路就是:

  • 将除了 ] 之外的所有元素推进栈
  • ] 后,将所有 [ 之前的元素 pop 出来
  • 重复对应次数后将字符串重新推进栈中
  • 重复步骤

可以将所有的元素保存在一个数组中,我这里就使用了两个 stacks 去分别保存数字和字符串。

"3[z]2[2[y]pq4[2[jk]e1[f]]]ef" 为例:

  1. 一直到 ] 以前都将所有元素推入 stack 中

    这里数字的 Stack 就不放了

  2. pop 出元素一直到 [,然后重复 N 次(这里 3 次)

  3. 重复步骤

  4. 结束

    这时候的数组就会包含 1 个或多个字符串:

使用 JavaScript 解题

一些边界条件没有处理,也是因为题目中保证了字符串的正确性。

const isNum = (char) => 
  return char >= 0 && char <= 9;
;

/**
 * @param string s
 * @return string
 */
var decodeString = function (s) 
  const strStack = [];
  const numStack = [];

  for (let i = 0; i < s.length; i++) 
    if (isNum(s[i])) 
      let numLen = i;
      while (isNum(s[numLen])) 
        numLen++;
      
      numStack.push(s.substring(i, numLen));
      i = numLen - 1;
     else if (s[i] === "[") 
      strStack.push("[");
     else if (s[i] === "]") 
      let repeatNum = numStack.pop();
      const repeatStr = [];
      while (strStack[strStack.length - 1] !== "[") 
        repeatStr.push(strStack.pop());
      
      // pop '['
      strStack.pop();
      repeatStr.reverse();
      const size = repeatStr.length;
      while (repeatNum > 1) 
        repeatStr.push(...repeatStr.slice(0, size));
        repeatNum--;
      
      strStack.push(repeatStr.join(""));
     else 
      strStack.push(s[i]);
    
  

  return strStack.join("");
;

以上是关于[JavaScript 刷题] 栈 - 字符串解码, leetcode 394的主要内容,如果未能解决你的问题,请参考以下文章

[JavaScript 刷题] 栈 - 最小栈, leetcode 155

[JavaScript 刷题] 栈 - 原子的数量, leetcode 726

[JavaScript 刷题] 栈 - 原子的数量, leetcode 726

[JavaScript 刷题] 栈 - 原子的数量, leetcode 726

[JavaScript 刷题] 栈 - 有效的括号, leetcode 20

[JavaScript 刷题] 栈 - 有效的括号, leetcode 20