Skip to content

Commit 04657f6

Browse files
committed
Solve problem #394
1 parent b59ec39 commit 04657f6

File tree

2 files changed

+98
-0
lines changed

2 files changed

+98
-0
lines changed
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
package org.sean.stack;
2+
3+
import java.util.Stack;
4+
5+
/***
6+
* 394. Decode String
7+
*/
8+
public class StringDecoder {
9+
private Stack<String> stack = new Stack<>();
10+
11+
// stack ops involve digits and chars
12+
// * [ -> digit : keep pushing in
13+
// * ] -> strs = chars * digit, push(strs)
14+
// * char -> pushed in
15+
public String decodeString(String s) {
16+
int len = s.length();
17+
int i = 0;
18+
StringBuilder numBuilder = new StringBuilder();
19+
while (i < len) {
20+
char ch = s.charAt(i);
21+
if (Character.isDigit(ch)) {
22+
numBuilder.append(ch);
23+
} else if (ch == '[') {
24+
if (numBuilder.length() > 0) {
25+
// int multipler = Integer.parseInt(numBuilder.toString());
26+
stack.push(numBuilder.toString());
27+
28+
numBuilder = new StringBuilder();
29+
}
30+
} else if (ch == ']') {
31+
StringBuilder builder = new StringBuilder();
32+
String str = stack.pop();
33+
int n = Integer.parseInt(stack.pop());
34+
35+
for (int j = 0; j < n; j++) {
36+
builder.append(str);
37+
}
38+
if (!stack.isEmpty()) {
39+
String top = stack.peek();
40+
if (Character.isLetter(top.charAt(0))) {
41+
stack.pop();
42+
stack.push(builder.insert(0, top).toString());
43+
} else {
44+
stack.push(builder.toString());
45+
}
46+
} else {
47+
stack.push(builder.toString());
48+
}
49+
50+
} else { // letter
51+
if (!stack.isEmpty()) {
52+
String top = stack.peek();
53+
if (Character.isDigit(top.substring(0, 1).charAt(0))) {
54+
stack.push(ch + "");
55+
} else {
56+
stack.pop();
57+
stack.push(top + ch);
58+
}
59+
} else {
60+
stack.push(ch + "");
61+
}
62+
}
63+
++i;
64+
}
65+
66+
StringBuilder sb = new StringBuilder();
67+
while (!stack.isEmpty()) {
68+
sb.append(stack.pop());
69+
}
70+
71+
return sb.toString();
72+
}
73+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package org.sean.stack;
2+
3+
import org.junit.Assert;
4+
import org.junit.Test;
5+
6+
import static org.junit.Assert.*;
7+
8+
public class StringDecoderTest {
9+
private StringDecoder decoder = new StringDecoder();
10+
11+
@Test
12+
public void testStr() {
13+
Assert.assertEquals("accaccacc", decoder.decodeString("3[a2[c]]"));
14+
Assert.assertEquals("abcabccdcdcdef", decoder.decodeString("2[abc]3[cd]ef"));
15+
16+
Assert.assertEquals("aaabFFFFcbFFFFc", decoder.decodeString("3[a]2[b4[F]c]"));
17+
}
18+
19+
@Test
20+
public void decodeLongString() {
21+
String t = "3[z]2[2[y]pq4[2[jk]e1[f]]]ef";
22+
Assert.assertEquals("zzzyypqjkjkefjkjkefjkjkefjkjkefyypqjkjkefjkjkefjkjkefjkjkefef",
23+
decoder.decodeString(t));
24+
}
25+
}

0 commit comments

Comments
 (0)