递归解析字符串 Q394. Decode String

这道题看完了第一反应是用递归或者栈来做,第二反应是递归和栈是一回事。。。用递归写可读性高一些,所以就用递归做了。
这道题我卡了半天,因为没想出来如何让字符串的指针“实时”向前走,我一开始是设置一个for循环,用charAt()遍历字符串,这样做会导致一个很麻烦的问题:’]’ 无法处理,’]‘标志一段字母结束,所以当读到’]‘时应该返回,这时会返回至上一层,蛋疼的问题出现了,上一层的指针这时也指向这个’]’,因此上一层也直接返回了。。。这个问题的关键是没有“实时”让指针向前走,解决方案非常简单,一开始把每个字母放到一个链表里即可,每次用poll()调出字符,这样在返回上一层时就不会出现这种蛋疼的情况。

class Solution {
    private StringBuilder sb = new StringBuilder();
    private LinkedList<Character> queue = new LinkedList<Character>(); 
    public String decodeString(String s) {
        for(int i=0;i < s.length();i++){
            queue.offer(s.charAt(i));
        }
        String ret = addString(queue).toString();
        return ret;
    }
    
    public StringBuilder addString(LinkedList<Character> queue){
        StringBuilder sb1 = new StringBuilder();
        while(!queue.isEmpty()){
            char charct = queue.poll();
            if(Character.isDigit(charct)){
                int count = Character.getNumericValue(charct);
                while(Character.isDigit(queue.peek())){
                    char num = queue.poll();
                    count = 10 * count + Character.getNumericValue(num);
                }
                StringBuilder temp = addString(queue);
                for(int k=0; k < count;k++){                       
                    sb1.append(temp);
                }
            }else if(charct == ']'){
                return sb1;
            }else if(!Character.isDigit(charct) && charct != '['){
                sb1.append(charct);               
            }            
        }
        return sb1;
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_44015873/article/details/85800954
今日推荐