Featured image of post 394. 字符串编码

394. 字符串编码

题目描述

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

编码规则为: 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”

提示:

  • 1 <= s.length <= 30
  • s 由小写英文字母、数字和方括号 '[]' 组成
  • s 保证是一个 有效 的输入。
  • s 中所有整数的取值范围为 [1, 300]

解法一:栈

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
func decodeString(s string) string {
    idx := 0
    var stk []string
    getDigits := func() string {
        num := ""
        for s[idx] >= '0' && s[idx] <= '9' {
            num += string(s[idx])
            idx++
        }
        return num
    }
    for idx < len(s) {
        if s[idx] >= '0' && s[idx] <= '9' {
            stk = append(stk, getDigits())
        } else if s[idx] == ']' {
            var sub []string
            for stk[len(stk)-1] != "[" {
                sub = append(sub, stk[len(stk)-1])
                stk = stk[:len(stk)-1]
            }
            // reverse character
            for i := 0; i < len(sub)/2; i++ {
                sub[i], sub[len(sub)-i-1] = sub[len(sub)-i-1], sub[i]
            }
            // pop [ from stack
            stk = stk[:len(stk)-1]
            // get repeat count
            cnt, _ := strconv.Atoi(stk[len(stk)-1])
            // pop repeat count from stack
            stk = stk[:len(stk)-1]
            // repeat sub and push result to stack
            stk = append(stk, strings.Repeat(strings.Join(sub, ""), cnt))
            idx++
        } else {
            stk = append(stk, string(s[idx]))
            idx++
        }
    }
    return strings.Join(stk, "")
}
Licensed under CC BY-NC-SA 4.0
comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计