题解 | #牛牛的字符串解码问题#
牛牛的字符串解码问题
https://www.nowcoder.com/practice/e5658311e6d44b74872e843ba13ee290
- 创建两个栈,一个用于保存数字(即重复次数
countStack),另一个用于保存字符串(strStack)。 - 遍历给定的编码字符串
s。如果遇到数字,解析整个数字(可能有多位),并将其推入countStack。如果遇到字母,将其加到当前解码字符串(curStr)上。如果遇到[,表示一个新的编码字符串开始,将当前解码字符串curStr和当前的重复次数推入各自的栈中,并重置curStr和count。如果遇到],表示当前编码字符串结束,从countStack中弹出重复次数,将curStr重复相应次数,并与从strStack弹出的字符串连接起来,更新curStr。 - 遍历完成后,
curStr即为解码后的字符串。
func decodeString(s string) string {
var countStack []int
var strStack []string
curNum := 0
curStr := ""
for _, char := range s {
if unicode.IsDigit(char) {
// 解析数字
num, _ := strconv.Atoi(string(char))
curNum = curNum*10 + num
} else if char == '[' {
// 遇到'[',将当前数字和字符串入栈,并重置
countStack = append(countStack, curNum)
strStack = append(strStack, curStr)
curNum = 0
curStr = ""
} else if char == ']' {
// 遇到']',出栈,并构造字符串
repeatTimes := countStack[len(countStack)-1]
countStack = countStack[:len(countStack)-1]
prevStr := strStack[len(strStack)-1]
strStack = strStack[:len(strStack)-1]
curStr = prevStr + repeat(curStr, repeatTimes)
} else {
// 字母,直接加到当前字符串
curStr += string(char)
}
}
return curStr
}
// repeat函数用于重复字符串n次
func repeat(str string, n int) string {
result := ""
for i := 0; i < n; i++ {
result += str
}
return result
}
