給定一個通過編碼的字符串,返回它解碼後的字符串。 java
編碼規則爲: k[encoded_string],表示其中方括號內部的 encoded_string 正好重複 k 次。注意 k 保證爲正整數。 git
你能夠認爲輸入字符串老是有效的;輸入字符串中沒有額外的空格,且輸入的方括號老是符合格式要求的。 ide
此外,你能夠認爲原始數據不包含數字,全部的數字只表示重複的次數 k ,例如不會出現像 3a 或 2[4] 的輸入。 編碼
示例: spa
s = "3[a]2[bc]", 返回 "aaabcbc". code
s = "3[a2[c]]", 返回 "accaccacc". 字符串
s = "2[abc]3[cd]ef", 返回 "abcabccdcdcdef". string
本題中明顯有括號的匹配問題,所以須要使用棧來求解。當碰到右括號(])時,字符串出棧,碰到左括號([)時,保存左右括號內的字符串([]),繼續出棧,保存字符串重複次數,直至棧爲空或碰到非數字。要注意重複次數不是個位數,將字符串重複以後壓入棧中。繼續處理剩餘字符串,一樣執行上述過程,直至處理完字符串。而後將棧中全部的字符出棧構成結果字符串返回。 it
1 import java.util.Stack; 2 3 public class Solution{ 4 public String decodeString(String s){ 5 int n=s.length(); 6 Stack<Character> stack=new Stack<Character>(); 7 String result=""; 8 String temp=""; 9 for(int i=0;i<n;i++){ 10 char str=s.charAt(i); 11 if(str!=']'){ 12 stack.push(str); 13 }else{ 14 char ch=stack.pop(); 15 while(ch!='['){ 16 temp=ch+temp; 17 ch=stack.pop(); 18 } 19 String times=""; 20 while(!stack.isEmpty()){ 21 ch=stack.pop(); 22 if(Character.isDigit(ch)){ 23 times=ch+times; 24 }else{ 25 stack.push(ch); 26 break; 27 } 28 } 29 for(int j=0;j<Integer.parseInt(times);j++){ 30 for(int k=0;k<temp.length();k++){ 31 stack.push(temp.charAt(k)); 32 } 33 } 34 temp=""; 35 } 36 } 37 while(!stack.isEmpty()){ 38 result=stack.pop()+result; 39 } 40 return result; 41 } 42 }