Problem
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; there are 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 will not be input like 3a
or 2[4]
.
The test cases are generated so that the length of the output will never exceed 10^5
.
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"
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]
.
Solution (Java)
class Solution {
private int i = 0;
public String decodeString(String s) {
int count = 0;
StringBuilder sb = new StringBuilder();
while (i < s.length()) {
char c = s.charAt(i);
i++;
if (Character.isLetter(c)) {
sb.append(c);
} else if (Character.isDigit(c)) {
count = count * 10 + Character.getNumericValue(c);
} else if (c == ']') {
break;
} else if (c == '[') {
// sub problem
String repeat = decodeString(s);
while (count > 0) {
sb.append(repeat);
count--;
}
}
}
return sb.toString();
}
}
Solution (Javascript)
/**
* @param {string} s
* @return {string}
*/
var decodeString = function(s) {
const resultArr = [''];
const timesStack = [];
let times = 0;
for (let i = 0; i < s.length; i++) {
const char = s[i];
if (!Number.isNaN(Number(char))) {
times = 10 * times + Number(char);
} else if (char === '[') {
timesStack.push(times);
resultArr.push('');
times = 0;
} else if (char === ']') {
const times = timesStack.pop();
const subStr = resultArr.pop();
resultArr[resultArr.length - 1] += subStr.repeat(times);
} else {
resultArr[resultArr.length - 1] += char;
}
}
return resultArr[0];
};
Explain:
nope.
Complexity:
- Time complexity : O(n).
- Space complexity : O(n).