(s)
| 1 | /* eslint-disable no-cond-assign */ |
| 2 | // 栈解法 先入后出 算出里面括号的结果 |
| 3 | function decodeString(s) { |
| 4 | let stack = [] |
| 5 | let res = '' |
| 6 | let count = 0 |
| 7 | // 扫描每一个字符 |
| 8 | for (let i = 0; i < s.length; i++) { |
| 9 | let item = s[i] |
| 10 | if (item >= '0' && item <= '9') { |
| 11 | // 获取当前循环的数字 如果以前有数字 加上当前的数字 要加10倍。 比如: 100[a] |
| 12 | count = count * 10 + Number(item) |
| 13 | continue |
| 14 | } else if (item === '[') { |
| 15 | stack.push({ count, lastRes: res }) // 收集以前的结果以及本次的循环次数 |
| 16 | // 重置 收集本次入栈的字符 |
| 17 | res = '' |
| 18 | count = 0 |
| 19 | continue |
| 20 | } else if (item === ']') { |
| 21 | // 先弹出里面的结果 |
| 22 | let { count, lastRes } = stack.pop() // 出栈 这次循环几次字符以及以前收集的字符 |
| 23 | // 外面的栈最后结算 外面的值被认作lastRes添加 比如'dd3[a2[c]]' // 进第一个栈时把dd传进去做lastres |
| 24 | res = lastRes + res.repeat(count) // 循环的字符串 + 以前收集的字符 拼接 |
| 25 | continue |
| 26 | } |
| 27 | res += s[i] |
| 28 | // 收集当前的字符 |
| 29 | // 不管是单独的: mn2[dd] res = 'mn' |
| 30 | // 还是入栈的: [abc res = 'abc' |
| 31 | } |
| 32 | return res |
| 33 | } |
| 34 | |
| 35 | // 递归解法 |
| 36 | // function decodeString(s) { |
nothing calls this directly
no outgoing calls
no test coverage detected