【問題描述】[中等]
給定一個經過編碼的字符串,返回它解碼后的字符串。編碼規則為: k[encoded_string],表示其中方括號內部的 encoded_string 正好重復 k 次。注意 k 保證為正整數。你可以認為輸入字符串總是有效的;輸入字符串中沒有額外的空格,且輸入的方括號總是符合格式要求的。此外,你可以認為原始數據不包含數字,所有的數字只表示重復的次數 k ,例如不會出現像 3a 或 2[4] 的輸入。示例:s = "3[a]2[bc]", 返回 "aaabcbc".
s = "3[a2[c]]", 返回 "accaccacc".
s = "2[abc]3[cd]ef", 返回 "abcabccdcdcdef".
【解答思路】
1. 輔助棧法
時間復雜度:O(N) 空間復雜度:O(N)
public String
decodeString(String s
) {StringBuilder res
= new StringBuilder();int multi
= 0 ; LinkedList
<Integer> stack_multi
= new LinkedList<>();LinkedList
<String> stack_res
= new LinkedList<>();for(Character c
: s
.toCharArray()){if(c
== '['){stack_multi
.addLast(multi
);stack_res
.addLast(res
.toString());multi
= 0;res
= new StringBuilder();}else if(c
== ']'){StringBuilder tmp
= new StringBuilder();int cur_multi
=stack_multi
.removeLast();for(int i
= 0;i
<cur_multi
;i
++){tmp
.append(res
);}res
= new StringBuilder(stack_res
.removeLast()+tmp
);}else if(c
>='0' && c
<='9'){multi
= multi
*10 +Integer
.parseInt(c
+"");}else{res
.append(c
);}}return res
.toString();}
2. 遞歸法
時間復雜度:O(N) 空間復雜度:O(N)
class Solution {char[] ss
;public String
decodeString(String s
) {this.ss
= s
.toCharArray();return dfs(0)[0];}private String
[] dfs(int i
) {int nums
= 0;StringBuilder res
= new StringBuilder();while (i
< ss
.length
) {if (Character
.isDigit(ss
[i
])) {nums
= nums
* 10 + (ss
[i
] - '0');} else if (ss
[i
] == '[') {String
[] temp
= dfs(i
+ 1); i
= Integer
.parseInt(temp
[0]);while (nums
> 0) {res
.append(temp
[1]);nums
--;}} else if (ss
[i
] == ']') {return new String[]{String
.valueOf(i
), res
.toString()};} else {res
.append(ss
[i
]);}i
++; }return new String[]{res
.toString()};}
}
class Solution {public String
decodeString(String s
) {return dfs(s
, 0)[0];}private String
[] dfs(String s
, int i
) {StringBuilder res
= new StringBuilder();int multi
= 0;while(i
< s
.length()) {if(s
.charAt(i
) >= '0' && s
.charAt(i
) <= '9') multi
= multi
* 10 + Integer
.parseInt(String
.valueOf(s
.charAt(i
))); else if(s
.charAt(i
) == '[') {String
[] tmp
= dfs(s
, i
+ 1);i
= Integer
.parseInt(tmp
[0]);while(multi
> 0) {res
.append(tmp
[1]);multi
--;}}else if(s
.charAt(i
) == ']') return new String[] { String
.valueOf(i
), res
.toString() };else res
.append(String
.valueOf(s
.charAt(i
)));i
++;}return new String[] { res
.toString() };}
}
【總結】
1.為什么用LinkedList不用Stack
基于 Vector 實現的棧 Stack底層是數組 擴容開銷大
Java并不推薦使用java.util.stack來進行棧的操作,而是推薦使用一個雙端隊列deque
詳情鏈接:https://www.cnblogs.com/cosmos-wong/p/11845934.html
2.細節
2.1 轉字符串
1、toString,需要保證調用這個方法的類、方法、變量不為null,否則會報空指針。
2、String.valueOf。這個方法在使用的時候是有些特殊的。一般情況下,如果是確定類型的null傳入,返回的是字符串“null”,而如果直接傳入null,則會發生錯誤。
3、(String) 字符串類型強轉。需要保證的是類型可以轉成String類型。
2.2 、2.3 應用于提取字符串中的數字字符轉整形
2.2 字符轉整型
Integer
.parseInt(c
+ "");
2.3 字符串中某字符轉整型
Integer
.parseInt(String
.valueOf(s
.charAt(i
)));
3.括號匹配 棧棧棧
4.包裝類的用法
轉載鏈接:https://leetcode-cn.com/problems/decode-string/solution/decode-string-fu-zhu-zhan-fa-di-gui-fa-by-jyd/
參考鏈接:https://blog.csdn.net/yangzhaomuma/article/details/51173138
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎
總結
以上是生活随笔為你收集整理的[Leedcode][JAVA][第394题][字符串解码][栈][类型转换]的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。