essay
hot100-字符串解码
#算法
hot100——字符串解码
给定一个经过编码的字符串,返回它解码后的字符串。
编码规则为: 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]
解法
// LeetCode 394. Decode String
// 使用栈模拟解码过程,手动用 for 循环实现字符串重复
func decodeString(s string) string {
// 两个栈:
// numStack:保存遇到的数字 k(用于后续重复次数)
// strStack:保存进入 '[' 之前的字符串片段(即外层上下文)
var numStack []int
var strStack []string
// currentStr:当前正在构建的字符串(当前层的内容)
// currentNum:当前正在解析的数字(可能是多位数)
currentStr := ""
currentNum := 0
// 遍历输入字符串的每一个字符
for _, ch := range s {
if ch >= '0' && ch <= '9' {
// 当前字符是数字,累加到 currentNum
// 例如 "12":第一次 currentNum=1,第二次 currentNum=1*10+2=12
currentNum = currentNum*10 + int(ch-'0')
} else if ch == '[' {
// 遇到 '[',表示要进入一个新的嵌套层级
// 将当前的数字和字符串压入栈中,保存上下文
numStack = append(numStack, currentNum)
strStack = append(strStack, currentStr)
// 重置状态,准备处理括号内的内容
currentNum = 0
currentStr = ""
} else if ch == ']' {
// 遇到 ']',表示当前嵌套层级结束,需要解码
// 弹出栈顶:获取重复次数 k 和外层字符串 prevStr
k := numStack[len(numStack)-1]
numStack = numStack[:len(numStack)-1]
prevStr := strStack[len(strStack)-1]
strStack = strStack[:len(strStack)-1]
// 手动用 for 循环将 currentStr 重复 k 次
repeated := ""
for i := 0; i < k; i++ {
repeated += currentStr // 每次拼接 currentStr
}
// 将重复后的字符串拼接到外层字符串后面,作为新的 currentStr
currentStr = prevStr + repeated
} else {
// 普通字母(a-z 或 A-Z),直接追加到当前字符串
currentStr += string(ch)
}
}
// 遍历结束后,currentStr 即为最终解码结果
return currentStr
}