附上原题连接:394. 字符串解码web
给定一个通过编码的字符串,返回它解码后的字符串。markdown
编码规则为: k[encoded_string]
,表示其中方括号内部的 encoded_string
正好重复 k
次。注意 k
保证为正整数。数据结构
你能够认为输入字符串老是有效的;输入字符串中没有额外的空格,且输入的方括号老是符合格式要求的。app
此外,你能够认为原始数据不包含数字,全部的数字只表示重复的次数 k
,例如不会出现像 3a
或 2[4]
的输入。oop
这道题会用到数据结构中的栈来解答。那么接下来咱们来看下这道题的解题步骤,具体以下:ui
num
变量,来存放倍数以及对倍数进行拼接操做。result
变量,用来拼接字符串。4
种状况:①遇到数字;②遇到 [
;③遇到 ]
;④遇到字母。依据上面的题解,咱们将用 js
来实现这道题。具体实现代码以下:编码
/** * @param {string} s * @return {string} */
let decodeString = function(s) {
// 1. 存倍数的栈
let numStack = [];
// 2. 存待拼接的str的栈
let strStack = [];
// 3. 倍数的“搬运工”
let num = 0;
// 4. 字符串的“搬运工”
let result = '';
// 5. 逐字符扫描
for (let char of s) {
// 5.1 遇到数字
if (!isNaN(char)) {
// 5.1.1 算出倍数
num = num * 10 + Number(char);
}
// 5.2 遇到 [
else if (char === '[') {
// 5.2.1 将result已经拼接完成的放到strStack当中
strStack.push(result);
// 5.2.2 入栈后清零
result = '';
// 5.2.3 倍数num进入栈等待
numStack.push(num);
// 5.2.4 入栈后清零
num = 0;
}
// 5.3 遇到 ],两个栈的栈顶出栈
else if (char === ']') {
// 5.3.1 获取拷贝次数
let repeatTimes = numStack.pop();
// 5.3.2 构建子串
result = strStack.pop() + result.repeat(repeatTimes);
}
// 5.4 遇到字母,追加给result串
else {
result += char;
}
}
// 6. 最终返回结果
return result;
};
console.log(decodeString('3[a2[c]]')); // accaccacc
console.log(decodeString('3[a]')); // aaa
复制代码
以上就是关于字符串编码的题解,不知道对小伙伴们是否有帮助呢?spa
咱们下期见👋👋👋code