1、数据结构:栈。同时对go中字符相关的rune类型进行学习。
rune:rune 类型可以直接通过 int()函数转为整型数字,[]rune类型可以直接通过string()函数转为string类型。
2、看到题目中包含括号的第一瞬间,想到可以使用栈的数据结构,将左括号以及中间的字符串入栈,直至遍历到右括号,将括号间的字符按规定次数进行重复后加入到结果字符串中。
注意:go中遍历,要先判断t>=0,随后才可以进行stack[t]=="xxx"的判断,否则会因为可能产生stack[-1]的情况而编译报错。
func decodeString(s string) string {
var tmpS []rune=[]rune(s)
var stack []rune
for i:=0; i<len(tmpS);{
if tmpS[i]==']'{
posSub, j:=len(stack), len(stack)-1
for stack[j]!='['{ j-- }
sub:=stack[j+1:posSub]
t, posRe:=j-1, j
for t>=0 && stack[t]<='9'&& stack[t]>='0'{ t-- }
rep:=stack[t+1:posRe]
stack=stack[:t+1]
stack=append(stack, getSubString(sub, rep)...)
i++
}else{
stack=append(stack, tmpS[i])
i++
}
}
return string(stack)
}
func getSubString(s ,r []rune) []rune{
var res []rune
rep:=0
for _, v:=range r{ rep=rep*10+int(v-'0') }
for i:=0; i<rep; i++{ res=append(res, s...) }
return res
}