打卡-字符串解码

2020-05-28  本文已影响0人  A邱凌

394. 字符串解码

import java.lang.StringBuilder

class DecodeString {

    /*
    * 给定一个经过编码的字符串,返回它解码后的字符串。
    * 编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。
    *
    * 你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。
    *
    * 此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a 或 2[4] 的输入。
    *
    * 示例:
    *
    * s = "3[a]2[bc]", 返回 "aaabcbc".
    * s = "3[a2[c]]", 返回 "accaccacc".
    * s = "2[abc]3[cd]ef", 返回 "abcabccdcdcdef".
    *
    * */
    fun decodeString(s: String): String {
        if (!s.contains('[')) {
            return s
        }
        var index = 0
        var result = StringBuilder()
        var times = StringBuilder()
        var tmpString = StringBuilder()
        var startIndex = 0
        var symbolCount = 0
        while (index < s.length) {
            if (s[index] == '[') {
                if (symbolCount == 0) {
                    startIndex = index + 1
                }
                symbolCount++
            } else if (s[index] in 'a'..'z') {
                if (symbolCount == 0) {
                    tmpString.append(s[index])
                }
            } else if (s[index] == ']') {
                symbolCount--
                if (symbolCount == 0) {
                    result.append(tmpString.toString())
                    result.append(generateTimesOfString(times.toString(), decodeString(s.substring(startIndex, index))))
                    result.append(decodeString(s.substring(index + 1, s.length)))
                    return result.toString()
                }
            } else {
                if (symbolCount == 0) {
                    times.append(s[index])
                }
            }
            index++
        }

        result.append(tmpString)
        return result.toString()
    }

    fun generateTimesOfString(times: String, string: String): String {
        if (times == "" || times == "0") {
            return ""
        }
        var sb = StringBuilder()
        for (i in 0 until times.toInt()) {
            sb.append(string)
        }
        return sb.toString();
    }
}
上一篇下一篇

猜你喜欢

热点阅读