Google – Decompress String
给一个string,比如abbaba4x[a]bb3x[abaa2x[bab]]。 4x[a]就表示aaaa, 2x[bab]就表示有两个连续的bab,babbab. 要求decompress 这个string。
[Solution]
[Solution #1]
recursion
碰到[]就递归整个括号里的东西,不管里面是否还有嵌套,也不管有几层嵌套。把递归回来的string整个append到stringbuilder,然后继续后面的。在碰到'['时需要找到与之对应的']',而不是在那之后的第一个close bracket!
[Solution #2]
Iterative
用一个stack来记录所有的Character, 一旦碰到close bracket ], 从stack里pop直到pop出open bracket。这样可以保证这两个括号肯定是一对并且在最里层。decompress之后把得到的结果再push回stack。继续后面的。
Read full article from Google – Decompress String
给一个string,比如abbaba4x[a]bb3x[abaa2x[bab]]。 4x[a]就表示aaaa, 2x[bab]就表示有两个连续的bab,babbab. 要求decompress 这个string。
[Solution]
[Solution #1]
recursion
碰到[]就递归整个括号里的东西,不管里面是否还有嵌套,也不管有几层嵌套。把递归回来的string整个append到stringbuilder,然后继续后面的。在碰到'['时需要找到与之对应的']',而不是在那之后的第一个close bracket!
[Solution #2]
Iterative
用一个stack来记录所有的Character, 一旦碰到close bracket ], 从stack里pop直到pop出open bracket。这样可以保证这两个括号肯定是一对并且在最里层。decompress之后把得到的结果再push回stack。继续后面的。
// recursiveclass Solution { public String decompression(String s) { if (s == null || s.isEmpty()) { return s; } StringBuilder result = new StringBuilder(); for (int i = 0; i < s.length(); i++) { char c = s.charAt(i); if (c >= 'a' && c <= 'z') { result.append(c); } else if (c >= '1' && c <= '9') { StringBuilder tmp = new StringBuilder(); int xIdx = s.indexOf("x", i); int cnt = Integer.parseInt(s.substring(i, xIdx)); i = xIdx + 2; int openLeft = 1; while (true) { if (s.charAt(i) == ']') { openLeft--; if (openLeft == 0) { break; } else { tmp.append(s.charAt(i)); } } else if (s.charAt(i) == '[') { openLeft++; tmp.append(s.charAt(i)); } else { tmp.append(s.charAt(i)); } i++; } String sub = decompression(tmp.toString()); for (int k = 0; k < cnt; k++) { result.append(sub); } } } return result.toString(); }}// iterative stackclass Solution2 { public String decompression(String s) { if (s == null || s.isEmpty()) { return s; } Stack<Character> stack = new Stack<>(); for (char c : s.toCharArray()) { if (c != ']') { stack.push(c); } else { List<Character> pattern = new LinkedList<>(); while (true) { char top = stack.pop(); if (top == '[') { break; } else { pattern.add(0, top); } } stack.pop(); StringBuilder tmp = new StringBuilder(); while (stack.peek() >= '0' && stack.peek() <= '9') { tmp.insert(0, stack.pop()); } int cnt = Integer.parseInt(tmp.toString()); for (int i = 0; i < cnt; i++) { for (char p : pattern) { stack.push(p); } } } } StringBuilder result = new StringBuilder(); while (!stack.isEmpty()) { result.append(stack.pop()); } return result.reverse().toString(); }}