1. 题目描述:
  2. 给定一个经过编码的字符串,返回它解码后的字符串。
  3. 编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。
  4. 你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。
  5. 此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a 2[4] 的输入。
  6. 示例 1
  7. 输入:s = "3[a]2[bc]"
  8. 输出:"aaabcbc"
  9. 示例 2
  10. 输入:s = "3[a2[c]]"
  11. 输出:"accaccacc"
  12. 示例 3
  13. 输入:s = "2[abc]3[cd]ef"
  14. 输出:"abcabccdcdcdef"
  15. 示例 4
  16. 输入:s = "abc3[cd]xyz"
  17. 输出:"abccdcdcdxyz"
  18. var decodeString = function (s) {//TODO}

我的回答

  1. 使用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) {

    1. str += current

    } else if (current == ‘[‘) {

    1. stack.push(current)

    } else if (current == ‘]’) {

    } else if (typeof current == ‘number’) {

    1. stack.push(current)

    } }

}

  1. <a name="SZw9J"></a>
  2. # 参考回答
  3. /* 思路方式: <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 />*/
  4. ```javascript
  5. var decodeString = function (s) {
  6. const stack = []
  7. let str = ''
  8. let multi = 0
  9. for (let c of s) {
  10. if (c === '[') {
  11. stack.push({ multi: multi, str: str })
  12. multi = 0
  13. str = ''
  14. } else if (c === ']') {
  15. const n = stack.pop()
  16. str = n.str + str.repeat(n.multi)
  17. } else if (c >= 0) {
  18. // 注意连续的数字
  19. multi = 10 * multi + parseInt(c)
  20. } else {
  21. str += c
  22. }
  23. }
  24. }
  25. return str

/* 思路:
递归写法,
当遍历到符号“[”时候,递归一次,得到对应的”]”的位置和中括号内的字符串,乘数multi在之前已经做了记录,只需要进行拼接。
遍历到符号“]”时,结束本次递归。

  • @param {string} s
  • @return {string}

*/

  1. var decodeString = function (s) {
  2. var dfs = (s, i) => {
  3. let res = '';
  4. let multi = 0;
  5. let tmp = '';
  6. while (i < s.length) {
  7. const str = s[i];
  8. if (str >= '0' && str <= '9') {
  9. multi = multi * 10 + Number(str);
  10. } else if (str === '[') {
  11. [i, tmp] = dfs(s, i + 1);
  12. res += tmp.repeat(multi); multi = 0;
  13. } else if (str === ']') {
  14. return [i, res];
  15. } else {
  16. res += str;
  17. }
  18. i++;
  19. }
  20. return res;
  21. }
  22. return dfs(s, 0);
  23. };