https://leetcode-cn.com/problems/decode-string/solution/zi-fu-chuan-jie-ma-by-leetcode-solution/

    [制卡]

    1. function decodeString(s: string): string {
    2. let numStack = []; // 存倍数的栈
    3. let strStack = []; // 存 待拼接的str 的栈
    4. let num = 0; // 倍数的“搬运工”
    5. let result = ''; // 字符串的“搬运工”
    6. for (const char of s) { // 逐字符扫描
    7. if (!isNaN(Number(char))) { // 遇到数字
    8. num = num * 10 + Number(char); // 算出倍数
    9. } else if (char == '[') { // 遇到 [
    10. strStack.push(result); // result串入栈
    11. result = ''; // 入栈后清零
    12. numStack.push(num); // 倍数num进入栈等待
    13. num = 0; // 入栈后清零
    14. } else if (char == ']') { // 遇到 ],两个栈的栈顶出栈
    15. let repeatTimes = Number(numStack.pop()); // 获取拷贝次数
    16. result = strStack.pop() + result.repeat(repeatTimes); // 构建子串
    17. } else {
    18. result += char; // 遇到字母,追加给result串
    19. }
    20. }
    21. return result;
    22. }
    // 思路受到day2 的题目 用双数组的方式 加递归;导致算倍数的时候 出现的复杂情况;
    // 目前只支持 个位数 的倍数;
    function decodeString(s: string): string {
        let kuohao = []
        let left = 0
        let right = 0
        for (let i = 0; i < s.length; i++) {
            if (s[i] === '[' || s[i] === ']') {
                kuohao.push([i, s[i]])
            }
        }
        if (kuohao.length === 0) return s
        // 第一个
        left = Number(kuohao[0][0])
        for (let i = 1; i < kuohao.length; i++) {
            let [key, val] = kuohao[i]
            if (val === '[') {
                left = Number(key)
            }
            if (val === ']') {
                right = Number(key)
                break
            }
    
        }
        let arrAdd = new Array<string>(Number(s[left - 1]));
        let arrAfter = arrAdd.fill(s.slice(left+1, right)).join('')
        let arrBefore = s.slice(0, left - 1)
        let arrEnd = s.slice(right+1)
        return decodeString(arrBefore+arrAfter+arrEnd)
    }
    
    console.log(decodeString("3[a]2[bc]"));
    console.log(decodeString("3[a2[c]]"));
    console.log(decodeString("abc3[cd]xyz"));