essay

hot100-字符串解码

#算法

hot100——字符串解码

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

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

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

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

测试用例保证输出的长度不会超过 10510^5

示例 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
}
comments如果有不同意见或者补充,直接留在这里。
contact

在别处继续找到我

如果你想聊技术、设计,或者只是打个招呼。

暂未配置外部链接