持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第4天,点击查看活动详情
字符串解码
题目链接:字符串解码
题目描述:给定一个经过编码的字符串,返回它解码后的字符串。
编码规则为: 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"
解题思路
辅助栈法
本题的难点在于括号内嵌套括号,需要从内向外生成和拼接字符串,这与栈的后进先出特性相对应。
创建辅助栈
strStack和numStack,分别用来存放字符和数字遍历每个字符
char,若char为数字,则转化为num,用于后续的倍数计算,若char为字母,则拼接到res后面当
char为[时,将res和num入栈,并分别置空当
char为]时,将num和res出栈,并进行拼接最后将拼接好的
res返回
需要注意的地方:判断单个字符是否为数字,使用 isNaN(char),isNaN(char) 为 false 时,说明字符为数字;在进行字符串的拼接时,使用 repeat 方法,传入的参数是出栈的 num,表示重复的次数。
题解
/**
* @param {string} s
* @return {string}
*/
var decodeString = function(s) {
let numStack = [];
let strStack = [];
let num = 0;
let res = '';
for (let char of s) {
if (!isNaN(char)) { // 如果 char 为数字
num = num * 10 + Number(char);
} else if (char === '[') { // 遇到 [ 进栈
strStack.push(res);
res = '';
numStack.push(num);
num = 0;
} else if (char === ']') { // 遇到 ] 出栈
let repeatTimes = numStack.pop(); // 重复次数
res = strStack.pop() + res.repeat(repeatTimes); // 拼接字符串
} else {
res += char;
}
}
return res;
};
总结
此篇文章记录了笔者在 leetcode 刷题时的一些思考,在遇到字符串中有数字和字母时,使用辅助栈可以帮助我们分类存放字符,以便于后续的操作(例如拼接),希望此文章能够为大家提供一些帮助,如有不足欢迎大家指正。谢谢!