leetcode/lintcode 题解] 解码字符串 · Decode String
【题目描述】
给出一个表达式 s
,此表达式包括数字,字母以及方括号。在方括号前的数字表示方括号内容的重复次数(括号内的内容可以是字符串或另一个表达式),请将这个表达式展开成一个字符串。
数字只能出现在“[]”前面。
在线测评地址:
https://www.lintcode.com/problem/decode-string/?utm_source=sc-js-mh0528
【样例】
样例1
<pre>输入: S = abc3[a]
输出: "abcaaa"</pre>
样例2
<pre>输入: S = 3[2[ad]3[pf]]xyz
输出: "adadpfpfpfadadpfpfpfadadpfpfpfxyz"</pre>
【题解】
<pre>public class Solution {
/**
* @param s an expression includes numbers, letters and brackets
* @return a string
*/
public String expressionExpand(String s) {
Stack<Object> stack = new Stack<>();
int number = 0;
for (char c : s.toCharArray()) {
if (Character.isDigit(c)) {
number = number * 10 + c - '0';
} else if (c == '[') {
stack.push(Integer.valueOf(number));
number = 0;
} else if (c == ']') {
String newStr = popStack(stack);
Integer count = (Integer) stack.pop();
for (int i = 0; i < count; i++) {
stack.push(newStr);
}
} else {
stack.push(String.valueOf(c));
}
}
return popStack(stack);
}
private String popStack(Stack<Object> stack) {
// pop stack until get a number or empty
Stack<String> buffer = new Stack<>();
while (!stack.isEmpty() && (stack.peek() instanceof String)) {
buffer.push((String) stack.pop());
}
StringBuilder sb = new StringBuilder();
while (!buffer.isEmpty()) {
sb.append(buffer.pop());
}
return sb.toString();
}
}</pre>
【更多语言代码参考】
https://www.jiuzhang.com/solution/decode-string/?utm_source=sc-js-mh0528
网友评论