LeetCode 394 – 字符串解码

题目描述

给定一个经过编码的字符串,返回它解码后的字符串。
编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。
你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。
此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a 或 2[4] 的输入。

示例:
输入:s = “3[a2[c]]”
输出:”accaccacc”

题目分析

使用 StringBuilder 存储数据,枚举字符,每次遇到 ] 就展开一次。

Java

public String decodeString(String s) {
    StringBuilder ans = new StringBuilder();
    for (int i = 0; i < s.length(); i++) {
        if (s.charAt(i) == ']') {
            StringBuilder temp = new StringBuilder();
            int num = 0;
            int numLength = 0;
            while (true) {
                char ch = ans.isEmpty() ? '-' : ans.charAt(ans.length() - 1);
                if (ch <= '9' && ch >= '0') {
                    // 读取数字
                    num += (int) (Math.pow(10, numLength++) * (ch - '0'));
                } else if (num > 0) {
                    // 数字读取完毕
                    while (num-- > 0) {
                        ans.append(temp);
                    }
                    break;
                } else if (ch != '[') {
                    temp.insert(0, ch);
                }
                ans.deleteCharAt(ans.length() - 1);
            }
        } else {
            ans.append(s.charAt(i));
        }
    }
    return ans.toString();
}

Kotlin

fun decodeString(s: String): String {
    val ans = StringBuilder()
    for (c in s) {
        if (c != ']') {
            ans.append(c)
        } else {
            val temp = StringBuilder()
            var num = 0
            var numLength = 0
            while (true) {
                val p = if (ans.isEmpty()) '-' else ans.last()
                if (p in '0'..'9') {
                    num += 10.0.pow(numLength++).toInt() * (p - '0')
                } else if (num > 0) {
                    while (num-- > 0) {
                        ans.append(temp)
                    }
                    break;
                } else if (p != '[') {
                    temp.insert(0, p);
                }
                ans.deleteCharAt(ans.length - 1)
            }
        }
    }
    return ans.toString()
}

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部