Leetcode--394. 字符串解码(Java)
給定一個(gè)經(jīng)過編碼的字符串,返回它解碼后的字符串。
編碼規(guī)則為:?k[encoded_string],表示其中方括號(hào)內(nèi)部的?encoded_string?正好重復(fù)?k?次。注意?k?保證為正整數(shù)。
你可以認(rèn)為輸入字符串總是有效的;輸入字符串中沒有額外的空格,且輸入的方括號(hào)總是符合格式要求的。
此外,你可以認(rèn)為原始數(shù)據(jù)不包含數(shù)字,所有的數(shù)字只表示重復(fù)的次數(shù)?k?,例如不會(huì)出現(xiàn)像?3a?或?2[4]?的輸入。
示例:
s = "3[a]2[bc]", 返回 "aaabcbc". s = "3[a2[c]]", 返回 "accaccacc". s = "2[abc]3[cd]ef", 返回 "abcabccdcdcdef".思路:
利用棧
如果棧為空而且沒有[,那就說明都是字符,直接拼接到result字符串
如果遇到[,數(shù)字,字符就入棧
如果遇到],就出棧,出棧之后,如果棧不為空,就把剛剛處理完的字符串再入棧,如果為空,就放到結(jié)果字符串
例如:"3[a]2[b4[F]c]"
棧:3[a? 遇到]? 字符串t為aaa,此時(shí)棧為空,所以result=aaa
棧:2[b4[F? ?遇到], 字符串t為FFFF, 此時(shí)棧不為空,所以把FFFF入棧,
棧:2[bFFFFc? ?遇到]? ?字符串t為bFFFFcbFFFFc,棧為空,所以拼到result
所以result=aaabFFFFcbFFFFc?
代碼:
//棧里面:3[a????遇到]
?//依次出棧,直到遇到[
//3a???aaa
//2bc??bcbc
?
//前面沒有數(shù)字,就默認(rèn)是1
//3[a2[c]]
//3[a2[c??遇到]
//如果棧為空,cc就先并到結(jié)果里面,如果棧不為空,就把他拼到棧頂元素
//3[acc??
//accaccacc
class?Solution?{
????public?String?decodeString(String?s)?{
????????if(s.length()==0||s==null){
??????????return?s;
??????}
??????Stack<Character>?stack?=?new?Stack<>();
??????StringBuilder?sb?=?new?StringBuilder();
??????StringBuilder?result?=?new?StringBuilder();
??????for(int?i=0;i<s.length();i++){
??????????if(stack.isEmpty()&&(s.charAt(i)<'0'||s.charAt(i)>'9')){
??????????????result.append(s.charAt(i));
??????????}else{
??????????????if(s.charAt(i)==']'){
??????????????????StringBuilder?t?=?new?StringBuilder();
??????????????????while(stack.peek()!='['){
??????????????????????t.append(stack.pop());
??????????????????}
??????????????????stack.pop();
??????????????????t.reverse();
??????????????????int?n=0;
??????????????????int?pow?=?1;
??????????????????while(!stack.isEmpty()&&stack.peek()>='0'&&stack.peek()<='9'){
???????????????????????n?=?n+(int)(stack.peek()-'0')*pow;
???????????????????????pow*=10;
???????????????????????stack.pop();
??????????????????}
??????????????????for(int?j=1;j<=n;j++){
??????????????????????sb.append(t);
??????????????????}
??????????????????if(stack.isEmpty()){
??????????????????????result.append(sb);
??????????????????????sb=new?StringBuilder();
??????????????????}else{
??????????????????????for(int?j=0;j<sb.length();j++){
??????????????????????????stack.push(sb.charAt(j));
??????????????????????}
??????????????????????sb=new?StringBuilder();
??????????????????}
??????????????}else{
??????????????????stack.push(s.charAt(i));
??????????????}
??????????}
??????}
??????return?result.toString();
????}
}
總結(jié)
以上是生活随笔為你收集整理的Leetcode--394. 字符串解码(Java)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【剑指offer】面试题31:栈的压入、
- 下一篇: 【剑指offer】面试题68 - I:二