073_字符串解码
知识点:栈
LeetCode第三百九十四题:https://leetcode-cn.com/problems/decode-string/submissions/
语言:GoLang
// 朴素的双栈解法,双百。细节多,思路不难。但是也用了两个小时了。。。
func decodeString(s string) string {
nStack, cStack := []rune{}, []rune{}
for _, c := range s {
// [ 这个符号在栈内作为分隔符
if c == '[' {
nStack = append(nStack, c)
cStack = append(cStack, c)
}
if c <= '9' && c >= '0' {
if len(nStack) == 0 {
nStack = append(nStack, '[')
}
nStack = append(nStack, c)
} else if c <= 'z' && c >= 'a' || c <= 'Z' && c >= 'A' {
cStack = append(cStack, c)
} else if c == ']' {
// 因为数字栈的最后一个字符一定是个'[',所以在提取数字之前要先截断
nStr, nStart := getString(nStack[:len(nStack) - 1])
cStr, cStart := getString(cStack)
nStack = nStack[:nStart + 1]
cStack = cStack[:cStart]
count := runeToInteger(nStr)
for ; count > 0; count-- {
cStack = append(cStack, cStr...)
}
}
}
return string(cStack)
}
func getString(stack []rune) ([]rune, int) {
i := len(stack) - 1
for ; i >= 0; i-- {
if stack[i] == '[' {
break
}
}
tmpString := make([]rune, len(stack[i + 1 :]))
copy(tmpString, stack[i + 1 :])
return tmpString, i
}
func runeToInteger(str []rune) int {
sum := 0
for i := 0; i < len(str) - 1; i++ {
sum += int(str[i] - '0')
sum *= 10
}
sum += int(str[len(str) - 1] - '0')
return sum
}