https://leetcode-cn.com/problems/decode-string/solution/zi-fu-chuan-jie-ma-by-leetcode-solution/
[制卡]
function decodeString(s: string): string {let numStack = []; // 存倍数的栈let strStack = []; // 存 待拼接的str 的栈let num = 0; // 倍数的“搬运工”let result = ''; // 字符串的“搬运工”for (const char of s) { // 逐字符扫描if (!isNaN(Number(char))) { // 遇到数字num = num * 10 + Number(char); // 算出倍数} else if (char == '[') { // 遇到 [strStack.push(result); // result串入栈result = ''; // 入栈后清零numStack.push(num); // 倍数num进入栈等待num = 0; // 入栈后清零} else if (char == ']') { // 遇到 ],两个栈的栈顶出栈let repeatTimes = Number(numStack.pop()); // 获取拷贝次数result = strStack.pop() + result.repeat(repeatTimes); // 构建子串} else {result += char; // 遇到字母,追加给result串}}return result;}
// 思路受到day2 的题目 用双数组的方式 加递归;导致算倍数的时候 出现的复杂情况;
// 目前只支持 个位数 的倍数;
function decodeString(s: string): string {
let kuohao = []
let left = 0
let right = 0
for (let i = 0; i < s.length; i++) {
if (s[i] === '[' || s[i] === ']') {
kuohao.push([i, s[i]])
}
}
if (kuohao.length === 0) return s
// 第一个
left = Number(kuohao[0][0])
for (let i = 1; i < kuohao.length; i++) {
let [key, val] = kuohao[i]
if (val === '[') {
left = Number(key)
}
if (val === ']') {
right = Number(key)
break
}
}
let arrAdd = new Array<string>(Number(s[left - 1]));
let arrAfter = arrAdd.fill(s.slice(left+1, right)).join('')
let arrBefore = s.slice(0, left - 1)
let arrEnd = s.slice(right+1)
return decodeString(arrBefore+arrAfter+arrEnd)
}
console.log(decodeString("3[a]2[bc]"));
console.log(decodeString("3[a2[c]]"));
console.log(decodeString("abc3[cd]xyz"));
