编码规则为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 = 0var 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}
