如何在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
相关产品推荐
相关产品推荐

