Typescript-Algorithms
    Preparing search index...

    Variable decode_stringConst

    decode_string: (s: string) => string = decodeString

    394.字符串解码

    给定一个经过编码的字符串,返回它解码后的字符串。

    编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。

    你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。

    此外,原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a2[4] 的输入。


    输入: s = "3[a]2[bc]"

    输出: "aaabcbc"


    输入: s = "3[a2[c]]"

    输出: "accaccacc"


    输入: s = "2[abc]3[cd]ef"

    输出: "abcabccdcdcdef"


    输入: s = "abc3[cd]xyz"

    输出: "abccdcdcdxyz"


    • 1 <= s.length <= 30
    • s 由小写英文字母、数字和方括号 '[]' 组成
    • s 保证是一个 有效 的输入
    • s 中所有整数均在 [1, 300] 范围内

    Type declaration

      • (s: string): string
      • Parameters

        • s: string

        Returns string

    1. 用两个栈,一个栈用来放历史数字,一个栈用来放历史字母
    2. 从左往右看字符:
      • 碰到数字我们不断构建多位数:curNum * 10 + num
      • 碰到字母,构建当前字母序列:curStr += char
      • 碰到[,保存历史记录,重置历史状态
      • 碰到],恢复历史记录,字符串解码

    保存状态的思路来自于:

    • 嵌套结构:表达式有层次关系
    • 状态暂停:进入内层时,外层状态需要暂停
    • 状态恢复:退出内层时,需要恢复外层状态
    • 栈的特性:后进先出,正好符合嵌套的进入和退出顺序
    function decodeString(s: string): string {
    const st1: number[] = []; // 数字栈
    const st2: string[] = []; // 字母栈
    let accNum: number = 0; // 当前累积的数字
    let accStr: string = ''; // 当前累积的字母

    for (let i = 0; i < s.length; i++) {
    if (s[i] >= '0' && s[i] <= '9') {
    accNum = accNum * 10 + (+s[i]);
    }
    else if (s[i].charCodeAt(0) - 'a'.charCodeAt(0) >= 0 && s[i].charCodeAt(0) - 'a'.charCodeAt(0) <= 25) {
    accStr += s[i];
    }
    else if (s[i] === '[') {
    st1.push(accNum);
    st2.push(accStr);

    accNum = 0;
    accStr = '';
    }
    else {
    const times = st1.pop()!;
    const prevStr = st2.pop()!;

    accStr = prevStr + accStr.repeat(times);
    }
    }

    return accStr;
    }