0394. Decode String
https://leetcode.com/problems/decode-string
Description
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]
.
Example 1:
**Input:** s = "3[a]2[bc]"
**Output:** "aaabcbc"
Example 2:
**Input:** s = "3[a2[c]]"
**Output:** "accaccacc"
Example 3:
**Input:** s = "2[abc]3[cd]ef"
**Output:** "abcabccdcdcdef"
Example 4:
**Input:** s = "abc3[cd]xyz"
**Output:** "abccdcdcdxyz"
Constraints:
1 <= s.length <= 30
s
consists of lowercase English letters, digits, and square brackets'[]'
.s
is guaranteed to be a valid input.All the integers in
s
are in the range[1, 300]
.
ac1: iterative
class Solution {
public String decodeString(String s) {
// edge cases
if (s == null || s.length() < 3) return s;
Stack<StringBuilder> stack = new Stack<>();
stack.push(new StringBuilder());
Stack<Integer> numstack = new Stack<>();
int len = s.length();
for (int i = 0; i < len; i++) {
char c = s.charAt(i);
if (c >= '0' && c <= '9') { // meet number
int n = 0;
while (i < len && s.charAt(i) >= '0' && s.charAt(i) <= '9') {
n = n * 10 + (s.charAt(i) - '0');
i++;
}
numstack.push(n);
i--;
} else if (c == '[') {
stack.push(new StringBuilder());
} else if (c == ']') {
StringBuilder curr = stack.pop();
String repeatString = curr.toString();
int k = numstack.pop();
while (k > 1) {
curr.append(repeatString);
k--;
}
stack.peek().append(curr.toString());
} else {
stack.peek().append(c);
}
}
return stack.pop().toString();
}
}
ac2: recursive
iterative stack == recursive
class Solution {
int i = 0;
public String decodeString(String s) {
int n = 0;
StringBuilder sb = new StringBuilder();
while (i < s.length()) {
if(s.charAt(i) >= '0' && s.charAt(i) <= '9') {
while (i < s.length() && s.charAt(i) >= '0' && s.charAt(i) <= '9') {
n = n * 10 + (s.charAt(i) - '0');
i++;
}
i++; // skip [
String next = decodeString(s);
while ( n > 0) {
sb.append(next);
n--;
}
} else if (s.charAt(i) == ']') {
i++;
return sb.toString();
} else {
sb.append(s.charAt(i++));
}
}
return sb.toString();
}
}
Last updated
Was this helpful?