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
}
posted @ 2020-07-17 16:23  Cenyol  阅读(89)  评论(0编辑  收藏  举报