LeetCode-394. 字串解碼
阿新 • • 發佈:2021-12-27
題目來源
題目詳情
給定一個經過編碼的字串,返回它解碼後的字串。
編碼規則為: k[encoded_string]
,表示其中方括號內部的 encoded_string 正好重複 k 次。注意 k 保證為正整數。
你可以認為輸入字串總是有效的;輸入字串中沒有額外的空格,且輸入的方括號總是符合格式要求的。
此外,你可以認為原始資料不包含數字,所有的數字只表示重複的次數 k ,例如不會出現像3a
或2[4]
的輸入。
示例 1:
輸入: s = "3[a]2[bc]"
輸出: "aaabcbc"
示例 2:
輸入: s = "3[a2[c]]"
輸出: "accaccacc"
示例 3:
輸入: s = "2[abc]3[cd]ef"
輸出: "abcabccdcdcdef"
示例 4:
輸入: s = "abc3[cd]xyz"
輸出: "abccdcdcdxyz"
題解分析
解法一:棧
Either Excellent or Rustyclass Solution { public String decodeString(String s) { int n = s.length(); LinkedList<String> sta = new LinkedList<>(); int pos = 0; while(pos < n){ char ch = s.charAt(pos); if(Character.isDigit(ch)){// 數字直接進棧 StringBuilder sb = new StringBuilder(); while(pos < n && Character.isDigit(s.charAt(pos))){ sb.append(s.charAt(pos++)); } sta.addLast(sb.toString()); }else if(Character.isLetter(ch) || ch == '['){// 字母和左括號也進棧 sta.addLast(String.valueOf(ch)); pos++; }else{// 遇到右括號則出棧直到左括號 pos++; LinkedList<String> list = new LinkedList<>(); while(!sta.isEmpty() && !sta.peekLast().equals("[")){ list.addLast(sta.pollLast()); } sta.pollLast(); Collections.reverse(list); int times = Integer.parseInt(sta.pollLast()); String temp = getStrings(list); StringBuilder sb = new StringBuilder(); for(int i=0; i<times; i++){ sb.append(temp); } sta.addLast(sb.toString()); } } return getStrings(sta); } private String getStrings(List<String> list){ StringBuilder sb = new StringBuilder(); for(String str : list){ sb.append(str); } return sb.toString(); } }