Decode String

题目
Given an encoded string, return it's decoded string.

The encoding rule is: k[encoded_string], where the encoded_string inside the square brackets is being repeated exactly k times. Note that k is guaranteed to be a positive integer.

You may assume that the input string is always valid; No extra white spaces, square brackets are well-formed, etc.

Furthermore, you may assume that the original data does not contain any digits and that digits are only for those repeat numbers, k. For example, there won't be input like 3a or 2[4].

答案

class Solution {
    public int pos_matching_right_paren(String s, int left_paren_pos) {
        int count = 0;
        for(int i = left_paren_pos; i < s.length(); i++) {
            char c = s.charAt(i);
            if(c == '[') count++;
            else if(c == ']') count--;
            if(c == ']' && count == 0) return i;
        }
        return -1;
    }
    public String decodeString(String s) {
        if(s.length() <= 0) return "";
        // Find first char, could only be digit or letter
        char first_char = s.charAt(0);
        // Digit
        if(Character.isDigit(first_char)) {
            // Get the number
            int last_digit_idx = 0;
            for(int i = 0; i < s.length(); i++) {
                if(Character.isDigit(s.charAt(i)))
                    last_digit_idx = i;
                else
                    break;
            }
            int number = Integer.parseInt(s.substring(0, last_digit_idx + 1));
            int left_paren_pos = s.indexOf('[');
            int right_paren_pos = pos_matching_right_paren(s, left_paren_pos);
            String str = s.substring(left_paren_pos + 1, right_paren_pos);
            String decoded_str = decodeString(str);
            String repeat_str = "";
            for(int i = 0; i < number; i++) repeat_str += decoded_str;
            return repeat_str + decodeString(s.substring(right_paren_pos + 1));
        }
        // Letter
        else {
            int left_paren_pos = s.indexOf('[');
            if(left_paren_pos == -1) return s;
            int digit_index = 0;
            for(int i = 0; i < s.length(); i++) {
                if(Character.isDigit(s.charAt(i))) {
                    digit_index = i;
                    break;
                }
            }
            return s.substring(0, (digit_index == -1)?s.length() : digit_index) + decodeString(s.substring(digit_index));
        }
    }
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • rljs by sennchi Timeline of History Part One The Cognitiv...
    sennchi阅读 8,146评论 0赞 10
  • 文章作者:Tyan博客:noahsnail.com | CSDN | 简书 1. 问题描述 Given an en...
    SnailTyan阅读 795评论 2赞 2
  • 问题: Given an encoded string, return it's decoded string.T...
    Cloudox_阅读 494评论 0赞 0
  • 今晚正准备学习时,收到代理发来的信息如下 做出这一行为,是因为张丽娜传达他两已经商量好,而且陈伯剑同意这样授权。陈...
    禹墨麻麻阅读 325评论 0赞 0
  • “孩子,你现在知道了吧,”睚眦此时终于露出了丝丝无奈,好像是对自己没有保护好妻子的悔恨,又像是这些年愧对孩子对自己...
    kjsky阅读 390评论 0赞 1

友情链接更多精彩内容