スナップJava版パーソナルコード共有-スタック編(文字列復号)


206.文字列復号
符号化された文字列を指定し、復号された文字列を返します.
符号化規則は、k[encoded_string]であり、カッコ内のencoded_を表すstringはちょうどk回繰り返します.注意kは正の整数であることを保証する.
入力文字列は常に有効であると考えられます.入力文字列には余分なスペースがなく、入力した四角カッコは常にフォーマットの要件を満たしています.
また、元のデータには数字は含まれておらず、すべての数字は重複回数kのみを表し、例えば3 aや2[4]のような入力は現れないと考えられます.

例1:入力:s=「3[a]2[bc]」出力:「aaabcbc」例2:入力:s=「3[a 2[c]」出力:「accaccac」例3:入力:s=「2[abc]3[cd]ef」出力:「abcabccdcdef」例4:入力:s=「abc 3[cd]xyz」出力:「abccdcdcdcdxyz」
コード#コード#
コードはleetcode@huangから
    public String decodeString(String s) {
     
        //      
        Stack<String> stack = new Stack<String>();
        for(int i=0;i<s.length();i++) {
     
            if(s.charAt(i) == ']'){
     
                String string="";
                //               
                while(!stack.peek().equals("[")){
     
                    string = stack.pop() + string;
                }
                stack.pop();
                String countString="";
                while((!stack.isEmpty())&&(stack.peek().charAt(0)>='0'&&stack.peek().charAt(0)<='9')) {
     
                    countString=stack.pop()+countString;
                }
                int count=Integer.parseInt(countString);
                String retString="";
                for (int j = 0; j < count; j++) {
     
                    retString = retString + string;
                }
                stack.push(retString);
            }else{
     
                String str=""+s.charAt(i);
                stack.push(str);
            }
        }
        String s1 = "";
        while(!stack.isEmpty()){
     
            s1 = stack.pop() + s1;
        }
        return s1;
    }

構想
(1)s文字列に対して左から右へ「」があるか否かを判断し,遭遇する前にtemp文字列につづる.(2)「」に遭遇した場合、temp文字列に対して右から左へString文字列の上につづり、「」に遭遇した場合に停止する.(3)2ステップ目に続いて数字countを取り出し続け、数字countと文字列Stringで得られた文字列をスタックに押し込む.(4)3ステップ目はs文字列の終わりにループし、スタック内の文字列を切り取って出力する.
注意事項
             

最適化対象