[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 theencoded_string
inside the square brackets is being repeated exactlyk
times. Note thatk
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 like3a
or2[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"
为例:
-
一直到
]
以前都将所有元素推入 stack 中这里数字的 Stack 就不放了
-
pop 出元素一直到
[
,然后重复 N 次(这里 3 次) -
重复步骤
-
结束
这时候的数组就会包含 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