題目
給定一個經過編碼的字符串,返回它解碼後的字符串。
編碼規則爲: 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”.
注意:重複次數不一定是個位數,而且可能存在括號嵌套,例如:“12[3[a]2[bc]]4[b]”
思路
我的思路很簡單,利用一個輔助棧來處理。具體邏輯見代碼註釋。
代碼
class Solution {
public String decodeString(String s) {
if(s==null||s.length()==0){
return s;
}
char[] array = s.toCharArray();
//一個輔助棧來存放字符
LinkedList<Character> stack1 = new LinkedList<>();
for(int i=0;i<array.length;i++){
if(array[i]!=']'){
//不是右括號直接入棧
stack1.push(array[i]);
}else{
//當遇到右括號的時候,進行出棧等一系列處理
StringBuilder ss = new StringBuilder();
//ss存括號內的字符,遇到左括號停止
while(stack1.peek()!='['){
ss.append(stack1.pop());
}
//把左括號彈出來
stack1.pop();
//計算重複次數(次數不一定是個位數,要注意處理)
int num = 0;
int count = 0;//記錄位數
while(!stack1.isEmpty()&&stack1.peek()>='0'&&stack1.peek()<='9'){
num = num + (stack1.pop()-'0')*(int)Math.pow(10,count);
count++;
}
StringBuilder sb = new StringBuilder();
//sb存重複後的字符串
for(int j=0;j<num;j++){
sb.append(ss.toString());
}
//因爲棧是先進後出,所以要reverse一下,再入棧
char[] temp = sb.reverse().toString().toCharArray();
for(int m=0;m<temp.length;m++){
stack1.push(temp[m]);
}
}
}
//此時,字符串被解碼完畢,以字符的形式存在棧中,出棧即可
StringBuilder res = new StringBuilder();
while(!stack1.isEmpty()){
res.append(stack1.pop());
}
//同樣,因爲棧是先進後出,所以要reverse一下
return res.reverse().toString();
}
}
看到這種使用棧的方式也很好: