You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在JavaScript中解码如2[2[32]1[82]]这类嵌套数字模式的字符串?

如何在JavaScript中解码如2[2[32]1[82]]这类嵌套数字模式的字符串?

嘿,我来帮你搞定这个嵌套字符串解码的问题!这种带多层括号的编码确实有点绕,但用栈来处理就会清晰很多——毕竟栈天生就适合对付这种嵌套结构的需求。

先明确下咱们要处理的规则:编码格式是k[encoded_string],方括号里的字符串要被精确重复k次,而且支持多层嵌套,比如你给的例子2[2[32]1[82]],解码后就是323282重复两次,也就是323282323282。

核心思路:用双栈记录状态

咱们可以用两个栈来分别保存重复次数和当前未完成的字符串,再配合两个变量记录当前正在构建的内容:

  • numStack:存嵌套层级对应的重复次数
  • strStack:存每个嵌套层级开始前的字符串
  • currentStr:当前正在拼接的普通字符
  • currentNum:当前累积的重复数字(支持多位数,比如12[abc]里的12)

具体步骤(遍历每个字符)

  • 如果遇到数字:把它累积到currentNum里(比如遇到'1'再遇到'2',就变成1*10+2=12)
  • 如果遇到[:说明要进入嵌套了,把当前的currentStr和currentNum分别压入栈,然后重置这两个变量,准备处理括号里的内容
  • 如果遇到]:说明当前嵌套结束,弹出栈顶的重复次数和之前的字符串,把currentStr重复对应次数后拼到之前的字符串后面,作为新的currentStr
  • 如果是普通字符(比如例子里的3、2、8):直接追加到currentStr里

JavaScript实现代码

function decodeString(s) {
    let numStack = [];
    let strStack = [];
    let currentStr = '';
    let currentNum = 0;

    for (let char of s) {
        // 处理多位数的重复次数
        if (!isNaN(char)) {
            currentNum = currentNum * 10 + parseInt(char);
        } 
        // 左括号:保存当前状态,进入嵌套
        else if (char === '[') {
            strStack.push(currentStr);
            numStack.push(currentNum);
            currentStr = '';
            currentNum = 0;
        } 
        // 右括号:计算当前嵌套的结果,合并到之前的字符串
        else if (char === ']') {
            const repeatTimes = numStack.pop();
            const prevStr = strStack.pop();
            currentStr = prevStr + currentStr.repeat(repeatTimes);
        } 
        // 普通字符直接拼接
        else {
            currentStr += char;
        }
    }

    return currentStr;
}

// 测试你的例子
console.log(decodeString('2[2[32]1[82]]')); // 输出: "323282323282"

这个方法能处理任意深度的嵌套,也支持多位数的重复次数,就算是没有括号的普通字符串(比如abc123)也能直接返回原内容,实用性拉满~

备注:内容来源于stack exchange,提问作者Kapil Sharma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.13 17:20:28