题目描述:给定一个经过编码的字符串,返回它解码后的字符串。编码规则为: 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"var decodeString = function (s) {//TODO}
我的回答
使用while循环
2. 使用stack栈数据进行数据存储 ```javascript function decodeString(s) { let stack = [] let str = ‘’ let i = 0 while(stack.length > 0) { let current = s[i] i++ if (typeof current == ‘string’ && stack.length > 0) {} else if (typeof current == ‘string’ && stack.length == 0) {
str += current
} else if (current == ‘[‘) {
stack.push(current)
} else if (current == ‘]’) {
} else if (typeof current == ‘number’) {
stack.push(current)
} }
}
<a name="SZw9J"></a># 参考回答/* 思路方式: <br />使用栈,循环遍历字符串 当c为数字时,计算倍数 10 * multi + parseInt(c) <br />当c为字母时,拼接字符串 str <br />当c为[时, 把倍数multi和 str推入栈中 stack.push({ multi: multi, str: str }),并重置multi和str的值<br />当c为]时, 出栈拼接字符串 str = n.str + str.repeat(n.multi) <br />*/```javascriptvar decodeString = function (s) {const stack = []let str = ''let multi = 0for (let c of s) {if (c === '[') {stack.push({ multi: multi, str: str })multi = 0str = ''} else if (c === ']') {const n = stack.pop()str = n.str + str.repeat(n.multi)} else if (c >= 0) {// 注意连续的数字multi = 10 * multi + parseInt(c)} else {str += c}}}return str
/* 思路:
递归写法,
当遍历到符号“[”时候,递归一次,得到对应的”]”的位置和中括号内的字符串,乘数multi在之前已经做了记录,只需要进行拼接。 
遍历到符号“]”时,结束本次递归。 
- @param {string} s
 - @return {string}
 
*/
var decodeString = function (s) {var dfs = (s, i) => {let res = '';let multi = 0;let tmp = '';while (i < s.length) {const str = s[i];if (str >= '0' && str <= '9') {multi = multi * 10 + Number(str);} else if (str === '[') {[i, tmp] = dfs(s, i + 1);res += tmp.repeat(multi); multi = 0;} else if (str === ']') {return [i, res];} else {res += str;}i++;}return res;}return dfs(s, 0);};
