美文网首页
394. 字符串解码--栈

394. 字符串解码--栈

作者: DevilRoshan | 来源:发表于2020-09-22 01:30 被阅读0次

    给定一个经过编码的字符串,返回它解码后的字符串。

    编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。

    你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。

    此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a 或 2[4] 的输入。

    示例 1:

    输入:s = "3[a]2[bc]"
    输出:"aaabcbc"
    

    示例 2:

    输入:s = "3[a2[c]]"
    输出:"accaccacc"
    

    示例 3:

    输入:s = "2[abc]3[cd]ef"
    输出:"abcabccdcdcdef"
    

    示例 4:

    输入:s = "abc3[cd]xyz"
    输出:"abccdcdcdxyz"
    

    解题

    type RemarkTempDecode struct {
        Num int
        Str string
    }
    
    func decodeString(s string) string {
        stack := make([]RemarkTempDecode, 0)
        num := 0
        str := ""
    
        for _, c := range s {
            if unicode.IsDigit(c) {
                c = c-'0'
                num = num * 10 + int(c)
            } else if c == '[' {
                rtd := RemarkTempDecode{
                    Num: num,
                    Str:   str,
                }
                stack = append(stack, rtd)
                str = ""
                num = 0
            } else if c == ']' {
                st := stack[len(stack)-1]
                stack = stack[:len(stack)-1]
                str = st.Str + strings.Repeat(str, st.Num)
            } else {
                str = str + string(c)
            }
        }
        return str
    }
    

    附:

    rune和byte的区别

    Go语言中byte和rune实质上就是uint8和int32类型。byte用来强调数据是raw data,而不是数字;而rune用来表示Unicode的code point。参考规范

    uint8       the set of all unsigned  8-bit integers (0 to 255)
    int32       the set of all signed 32-bit integers (-2147483648 to 2147483647)
    
    byte        alias for uint8
    rune        alias for int32
    

    0~9的数字都可以的整数都可以通过-'0'的方式获取:

    func PrintDigit(s string) {
        for _, c := range s {
            fmt.Print(c - '0')
        }
        fmt.Println("")
        for i := 0; i < len(s); i++ {
            fmt.Print(s[i] - '0')
        }
    }
    
    func main() {
        PrintDigit("0123456789")
    }
    
    

    unicode包判断字母、数字、空白符号

    包 unicode 包含了一些针对测试字符的非常有用的函数(其中 ch 代表字符)

    • 判断是否为字母: unicode.IsLetter(ch)
    • 判断是否为数字: unicode.IsDigit(ch)
    • 判断是否为空白符号: unicode.IsSpace(ch)

    相关文章

      网友评论

          本文标题:394. 字符串解码--栈

          本文链接:https://www.haomeiwen.com/subject/aksiyktx.html