题目
给定一个经过编码的字符串,返回它解码后的字符串。
编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。
你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。
此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a 或 2[4] 的输入。
示例1
输入: s = "3[a]2[bc]"
输出: "aaabcbc"
示例2
输入: s = "3[a2[c]]"
输出: "accaccacc"
题解
栈
对[]中括号是一个组合,将中括号内部的字符串拆出来与中括号外面的数字结合;很显然可以用栈这个数据结构来解决这类问题
- 将数据放在栈中
- 按照什么规律放置呢?
- 中括号
- 题目中说中括号内肯定是字符串
- 所以枚举字符串
- 遇到数字存到num中,遇到字符串存到result中
- 遇到[,将存储的数组、字符串放入栈中
- 遇到 ],将存储在栈中的字符串拿出来处理,处理过程详见下图
- 得到答案
代码
const decodeString = (s) => {
const stack = []
const string = []
let num = ''
let result = ''
for (let i = 0; i < s.length; i++) {
const k = s[i]
if (!isNaN(k)) {
num += k
} else if (k === '[') {
stack.push(num)
string.push(result)
num = ''
result = ''
} else if (k === ']') {
const currentNum = stack.pop()
result = string.pop() + result.repeat(Number(currentNum))
} else {
result += k
}
}
return result
}
正则
正则,一个强大的字符串匹配;正则匹配数字后面为中括号+从a-Z的字符串;然后对匹配到的字符串合并;可以得到答案。
正则代码
var decodeString = function (s) {
let reg = /(\d+)\[([a-zA-Z]+)\]/g;
while(s.indexOf('[')>0){
s = s.replace(reg,(_,...[num,str])=>{
let result = "";
for(let i=0;i<num-0;i++){
result += str;
}
return result;
});
}
return s;
};