// 壓縮字符串 'aaaaaabbbbbcccca' => 'a6b5c4a1'
function compressStr(strs = 'aaaaaabbbbbccccaa') {
let pre = strs[0]
let curNum = 1
let res = ''
for (let i = 1; i < strs.length; i++) {
const str = strs[i]
if (str === pre) {
curNum++
} else {
res += pre
res += curNum
pre = str
curNum = 1
}
}
res += pre
res += curNum
return res.length > strs.length ? strs : res
}
compressStr()
// 輸入:s = "3[a]2[bc]"
// 輸出:"aaabcbc"
const decodeString = (s = "3[a]2[bc]") => {
let numStack = [] // 存倍數的棧
let strStack = [] // 存 待拼接的str 的棧
let num = 0 // 倍數的“搬運工”
let result = '' // 字符串的“搬運工”
for (const char of s) {
// 逐字符掃描
if (/\d/.test(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 = numStack.pop() // 獲取拷貝次數
result = strStack.pop() + result.repeat(repeatTimes) // 構建子串
} else {
result += char // 遇到字母,追加給result串
}
}
return result
}
decodeString()