-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdecode_string.go
60 lines (56 loc) · 1.12 KB
/
decode_string.go
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
package conclusion
import "strings"
func decodeString(s string) string {
var stk []byte
for i := range s {
if s[i] == ']' {
si := strings.LastIndex(string(stk), "[")
var n, ni int
ti := 1
for ni = si - 1; ni >= 0; ni-- {
if d := int(stk[ni] - '0'); d >= 0 && d <= 9 {
n += d * ti
ti *= 10
} else {
break
}
}
ns := genStr(n, stk[si+1:])
stk = append(stk[:ni+1], ns...)
} else {
stk = append(stk, s[i])
}
}
return string(stk)
}
func genStr(n int, s []byte) (out []byte) {
for i := n; i > 0; i-- {
out = append(out, s...)
}
return
}
func decodeString1(s string) string {
var iStk []int
var nStk []int
var out []byte
var n int
for i := range s {
if s[i] == '[' {
iStk = append(iStk, len(out))
nStk = append(nStk, n)
n = 0
} else if s[i] >= '0' && s[i] <= '9' {
n = n*10 + int(s[i]-'0')
} else if s[i] == ']' {
idx := iStk[len(iStk)-1]
iStk = iStk[:len(iStk)-1]
subS := out[idx:]
rep := nStk[len(nStk)-1]
nStk = nStk[:len(nStk)-1]
out = append(out[:idx], genStr(rep, subS)...)
} else {
out = append(out, s[i])
}
}
return string(out)
}