394. 字符串解码

87 阅读1分钟

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

编码规则为: 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"

题解:

/**
 * @param {string} s
 * @return {string}
 */
// 方法一:双栈结构
var decodeString = function (s) {
    const numStack = [], // 存数字
        strStack = []; // 存字符
    let num = 0;
    let str = '';
    for (let ca of s) {
        if (!isNaN(ca)) { // 如果为数字累计为num
            num = num * 10 + Number(ca)
        } else if (ca == '[') { // 当遇到'[' 入栈操作,初始化数据
            numStack.push(num);
            num = 0;
            strStack.push(str);
            str = ''
        } else if (ca == ']') {// 当遇到']' 出栈操作 
            let r = numStack.pop()
            str = strStack.pop() + str.repeat(r)
        } else {
            str += ca
        }
    }
    return str
};
// 方法二:反向插入
var decodeString = function (s) {
    const stack = [];
    for (let ca of s) {
        // 没遇到']'一直向入栈操作
        if (ca !== ']') {
            stack.push(ca)
            continue
        }
        // 当遇到']'时 栈顶一定是字符串
        // 处理字符串
        let cur = stack.pop()
        let str = ''
        while (cur !== '[') {
            str = cur + str // 字符串顺序
            cur = stack.pop()
        }
        // 当遇到'['时 stack.pop()一定为数字
        let num = ''
        cur = stack.pop()
        while (!isNaN(cur)) {
            num = cur + num // 倍数字符串数字
            cur = stack.pop()
        }
        // 此时的cur要么是字符,要么是 [
        stack.push(cur)
        stack.push(str.repeat(num))
    }
    return stack.join('')
};

来源:力扣(LeetCode)

链接:leetcode.cn/problems/de…

著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。