版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/king_qg/article/details/82941744
Decode String
example
s = "3[a]2[bc]", return "aaabcbc".
s = "3[a2[c]]", return "accaccacc".
s = "2[abc]3[cd]ef", return "abcabccdcdcdef".
思路
这其实就是四则运算表达式的变形。
3[a]2[bc] == 3*(a)+2*(bc)
3[a2[c]] == 3*(a+2*(c))
2[abc]3[cd]ef == a*(abc)+3*(cd)+ef
四则运算表达式运用两个栈就可以求出结果,一个放操作数,一个放运算符。
由于这是字符串所以加的操作就省了,把乘的结果放回操作数那个栈就相加了。
所以我们只需要一个栈就可以了。
代码
//根据栈中的内容取出需要做乘法运算的两个操作数
func getSOpt(src []byte) (int, string) {
var err error
var retInt int
var retStr string
index := len(src) - 1
for src[index] != '[' {
index--
}
//t的索引是'['的位置索引
t := index
retStr = string(src[t+1:])
index--
for {
_, err = strconv.Atoi(string(src[index]))
//数字的边界分两种
//1 在中间位置遇到了不是数字的字符,
//2 数字已经到了字符串最前的位置
if err != nil || index == 0 {
break
}
index--
continue
}
start := index
if err != nil {
start += 1
}
retInt, _ = strconv.Atoi(string(src[start:t]))
return retInt, retStr
}
func decodeString(s string) string {
var tem []byte
var rep int
for i := 0; i < len(s); i++ {
if s[i] == ']' {
var tep string
//得到需要参与乘法运算的两个操作数
rep, tep = getSOpt(tem)
//计算需要剔除的长度信息,
j := len(tem) - len(tep) - len(strconv.Itoa(rep)) - 1
//把无用的字符从栈中取出,防止取出后为空栈
if j == 0 {
tem = []byte{}
} else {
tem = tem[:j]
}
//把乘的结果写入栈,并且和之前需要做加法的字符放在一起,相当于直接做了加法
for t := 0; t < rep; t++ {
tem = append(tem, tep[:]...)
}
continue
}
tem = append(tem, s[i])
}
return string(tem)
}