Leetcode 394.字符串編碼

字符串編碼

給定一個通過編碼的字符串,返回它解碼後的字符串。 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 }
相關文章
相關標籤/搜索