leetcode字串解碼
阿新 • • 發佈:2022-03-05
棧的運用。--》一個棧用於儲存數字判斷用於重複,另一個字串判斷【】用於插入標記。
class Solution { /** 我的想法: 把字元全部放入StringBuffer中,括號用int字元標記 次數放入棧裡面。單位為你太【number,flag】; */ public String decodeString(String s) { StringBuffer sb = new StringBuffer(); Stack<Integer> si = new Stack(); Stack<int[]> stack = new Stack(); int flag = 0; for(int i=0;i<s.length();i++){ char tmp = s.charAt(i); if(tmp>='0'&&tmp<='9'){ int i1 = 0; while(s.charAt(i+i1)>='0'&&s.charAt(i+i1)<='9'){ // System.out.println(tmp+i1); i1++; } stack.push(new int[]{ Integer.valueOf(s.substring(i,i+i1)),flag}); i=i+i1-1; }else if(tmp=='['){ si.push(flag); sb.append(flag); flag++; }else if(tmp==']'){ sb.append(si.pop()); }else{ sb.append(tmp); } } while(!stack.isEmpty()){ //tmp的0是次數。1是flag標記的位置。 int[] tmp = stack.pop(); //定義左右flag的位置 int left = sb.indexOf(String.valueOf(tmp[1])); int right = sb.lastIndexOf(String.valueOf(tmp[1])); //擷取字串加入到指定位置 String add = sb.substring(left+1,right); for(int i=1;i<tmp[0];i++){ sb.insert(right,add); } //重新整理右指標的位置 right = sb.lastIndexOf(String.valueOf(tmp[1])); //刪除標記 sb.deleteCharAt(left); sb.deleteCharAt(right-1); } return sb.toString(); } }