スナップ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から
構想
(1)s文字列に対して左から右へ「」があるか否かを判断し,遭遇する前にtemp文字列につづる.(2)「」に遭遇した場合、temp文字列に対して右から左へString文字列の上につづり、「」に遭遇した場合に停止する.(3)2ステップ目に続いて数字countを取り出し続け、数字countと文字列Stringで得られた文字列をスタックに押し込む.(4)3ステップ目はs文字列の終わりにループし、スタック内の文字列を切り取って出力する.
注意事項
最適化対象
符号化された文字列を指定し、復号された文字列を返します.
符号化規則は、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文字列の終わりにループし、スタック内の文字列を切り取って出力する.
注意事項
最適化対象