-
Notifications
You must be signed in to change notification settings - Fork 47
/
Copy path394.decode-string.java
74 lines (69 loc) · 1.76 KB
/
394.decode-string.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
/*
* @lc app=leetcode id=394 lang=java
*
* [394] Decode String
*
* https://leetcode.com/problems/decode-string/description/
*
* algorithms
* Medium (43.88%)
* Likes: 1535
* Dislikes: 85
* Total Accepted: 108.4K
* Total Submissions: 239.9K
* Testcase Example: '"3[a]2[bc]"'
*
* 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".
*
*
*
*
*/
class Solution {
public String decodeString(String s) {
if (s == null || s.length() == 0) {
return s;
}
Stack<Integer> countStack = new Stack<>();
Stack<String> strStack = new Stack<>();
String res = "";
int count = 0;
for (char ch : s.toCharArray()) {
if ('0' <= ch && ch <= '9') {
count = count * 10 + ch - '0';
} else if (ch == '[') {
countStack.push(count);
strStack.push(res);
count = 0;
res = "";
} else if (ch == ']') {
StringBuilder sb = new StringBuilder(strStack.pop());
for (int i = countStack.pop(); i > 0; i--) {
sb.append(res);
}
res = sb.toString();
} else {
res += ch;
}
}
return res;
}
}