【栈】 394 字符串解码

题目

k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。
输入:s = “3[a]2[bc]”
输出:“aaabcbc”
输入:s = “3[a2[c]]”
输出:“accaccacc”

思路

建立两个栈,分别存储数字和字母。
建立数字和字符串进行临时记录。
当遍历到数字时,放入数字中。
当遍历到字母时,放入字符串中。
当遍历到【时,将数字放入数字栈,并清零。将字符串放入字符串栈中,并清空。
当遍历到】时,数组栈出数字作为重复次数,字符串栈出字符加上临时字符串乘重复次数,就是此时的结果。
辅助栈图解

代码

public String decodeString(String s) {
     
    LinkedList<String> stack_string = new LinkedList<>();
    LinkedList<Integer> stack_number = new LinkedList<>();
    int curnum = 0;
    StringBuilder res = new StringBuilder();
    for(Character c : s.toCharArray()){
     
        if(c>='0'&&c<='9'){
     
            //Integer.parseInt(c + "")
            curnum  = curnum*10+Integer.parseInt(c + "");

        }//入栈,同时数字和字符串临时记录都记为0
        else if(c=='['){
     
            //记得toString
            stack_number.addLast(curnum);
            stack_string.addLast(res.toString());
            curnum = 0;
            //这里的res是stringbuilder类型不能直接等于“ ”
            res = new StringBuilder();


        }else if(c==']'){
     
            //出栈
            //StringBuilder适用于单线程下在字符缓冲区进行大量操作的情况
            StringBuilder tmp = new StringBuilder();
            int nownum = stack_number.removeLast();
            for(int i = 0;i < nownum;i++){
     
                tmp.append(res);
            }
            res = new StringBuilder(stack_string.removeLast()+tmp);

        }else{
     
            res.append(c);
        }


    }
    return res.toString();

}

你可能感兴趣的:(栈,字符串)