394.Decode-String
394. Decode String
题目地址
https://leetcode.com/problems/decode-string/
题目描述
Given an encoded string, return its decoded string.
The encoding rule is: k[encoded_string], where the encoded_string inside the square brackets is being repeated exactly k times. Note that k is guaranteed to be a positive integer.
You may assume that the input string is always valid; No extra white spaces, square brackets are well-formed, etc.
Furthermore, you may assume that the original data does not contain any digits and that digits are only for those repeat numbers, k. For example, there won't be input like 3a or 2[4].
Examples:
s = "3[a]2[bc]", return "aaabcbc".
s = "3[a2[c]]", return "accaccacc".
s = "2[abc]3[cd]ef", return "abcabccdcdcdef".
代码
Approach #1 Two Stack
数字: countStack.push(count) [
: resStack.push(res), res = "" ]
: pop, res = temp Else: res+=
class Solution {
public String decodeString(String s) {
String res = "";
Stack<Integer> countStack = new Stack<>();
Stack<Integer> resStack = new Stack<>();
int idx = 0;
while (idx < s.length()) {
if (Character.isDigit(s.charAt(idx))) {
int count = 0;
while (Character.isDigit(s.charAt(idx))) {
count = 10 * count + (s.charAt(idx) - '0');
idx++;
}
countStack.push(count);
}
else if (s.charAt(idx) == '[') {
resStack.push(res);
res = "";
idx++;
}
else if (s.charAt(idx) == ']') {
StringBuilder temp = new StringBuilder(resStack.pop());
int repeatTimes = countStack.pop();
for (int i = 0; i < repeatTimes; i++) {
temp.append(res);
}
res = temp.toString();
idx++;
}
else {
res += s.charAt(idx++);
}
}
return res;
}
}
Approach #2 DFS
使用一个全局pos
记录递归位置
[
开始递归, ]
返回结果
class Solution {
private int pos = 0;
public String decodeString(String s) {
StringBuilder sb = new StringBuilder();
String num = "";
for (int i = pos; i < s.length(); i++) {
// 1. 解析数字
if (Character.isDigit(s.charAt(i))) {
num += s.charAt(i);
}
// 2. '[', dfs递归,并记录pos
else if (s.charAt(i) == '[') {
pos = i + 1;
String next = decodeString(s);
for (int n = Integer.valueOf(num); n > 0; n--) {
sb.append(next);
}
num = "";
i = pos;
}
// 3. retrun 结果
else if (s.charAt(i) == ']') {
pos = i; // 返回上一层会进入for循环 pos + 1
return sb.toString();
}
else {
// 4. letter append
sb.append(s.charAt(i));
}
}
return sb.toString();
}
}
Approach #3 Queue
class Solution {
public String decodeString(String s) {
Deque<Character> queue = new LinkedList();
for (char c: s.toCharArray()) {
queue.offer(c);
}
return bfs(queue);
}
private String bfs(Deque<Character> queue) {
StringBuilder sb = new StringBuilder();
int num = 0;
while (!queue.isEmpty()) {
char c = queue.poll();
// 1. digit
if (Character.isDigit(c)) {
num = num * 10 + c - '0';
}
// 2. `[` 进入bfs递归
else if (c == '[') {
String sub = bfs(queue);
for (int i = 0; i < num; i++) {
sb.append(sub);
}
num = 0;
}
// 3. `]` break
else if (c == ']') {
break;
}
// 4. letter append
else {
sb.append(c);
}
}
return sb.toString();
}
}
Last updated