编码规则为k[encoded_string],表示其中⽅括号内部的encoded_string正好重复k次。 注意:k保证为正整数
你可以认为输⼊字符串总是有效的,输⼊字符串中没有额外的空格, 且输⼊的⽅括号总是符合格式要求的。此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数k,不会出现像3a或2[4]的输⼊
示例:
s = “3[a]2[bc]”
返回 “aaabcbc”
s = “3[a2[c]]”
返回 “accaccacc”
s = “2[abc]3[cd]ef”
返回 “abcabccdcdcdef”
s = “a3[b]2[c1[d1[e]]f]10[g]x2[y]z”
返回 “abbbcdefcdefggggggggggxyyz”
func decodeString(_ s: String) -> String {
var Str = String()
var num = 0
var stack_num = [Int]()
var stack_c = [String]()
for c in s {
if c.isNumber { //如果是数字,要对 num 进行操作
num = num*10 + Int(String(c))!
} else if c == "[" { //达到左边框,此时说明当前左边框的 ·遍历次数· 已经获取完毕,可以入栈
stack_num.append(num)
stack_c.append(Str) //如果左边有不需要重复的字母,所以也是需要入栈的
// 重复次数已经保存,临时变量可以置空
num = 0
// 置空,用于记录括号内的数据
Str = String()
} else if c == "]" { //遇到右边框,此时是最复杂的,注意,由于我们是入栈操作,所以stack_num栈顶元素对应的一定是,现在 ”[]“里面需要重复的元素信息
var tempStr = "" ///创建新的字符串,用于存储重复的字符
let cur_num = stack_num.removeLast()
for _ in 0..<cur_num {
tempStr.append(Str) // 当我们遇到`[`的时候,Str=nil;所以此时遇到`]`,Str为`[]`内的内容
}
Str = stack_c.removeLast() + tempStr
} else { //纯字母情况
Str.append(c)
}
}
return Str
}