X Tutup
Skip to content

Commit f786fe4

Browse files
author
liwentian
committed
fd
1 parent 7772667 commit f786fe4

File tree

3 files changed

+79
-55
lines changed

3 files changed

+79
-55
lines changed
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package com.leetcode.google;
2+
3+
import java.util.Deque;
4+
import java.util.LinkedList;
5+
import java.util.Queue;
6+
import java.util.Stack;
7+
8+
/**
9+
* Created by liwentian on 2017/8/30.
10+
*/
11+
12+
public class DecodeString {
13+
14+
public String decodeString(String s) {
15+
StringBuilder sb = new StringBuilder();
16+
17+
for (char c : s.toCharArray()) {
18+
if (c != ']') {
19+
sb.append(c);
20+
} else {
21+
String t = popString(sb);
22+
for (int i = popCount(sb); i > 0; i--) {
23+
sb.append(t);
24+
}
25+
}
26+
}
27+
28+
return sb.toString();
29+
}
30+
31+
private String popString(StringBuilder sb) {
32+
StringBuilder ss = new StringBuilder();
33+
34+
int i = sb.length() - 1;
35+
for ( ; sb.charAt(i) != '['; i--) {
36+
ss.append(sb.charAt(i));
37+
}
38+
sb.setLength(i);
39+
40+
return ss.reverse().toString();
41+
}
42+
43+
private int popCount(StringBuilder sb) {
44+
int i = sb.length() - 1, cnt = 0, t = 1;
45+
for ( ; i >= 0 && Character.isDigit(sb.charAt(i)); i--, t *= 10) {
46+
cnt += t * (sb.charAt(i) - '0');
47+
}
48+
sb.setLength(i + 1);
49+
return cnt;
50+
}
51+
}

solution/src/main/java/com/inuker/solution/DecodeString.java

Lines changed: 25 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -8,66 +8,42 @@
88

99
public class DecodeString {
1010

11-
/**
12-
* 两种思路,递归和栈
13-
*/
14-
15-
// 耗时3ms,性能很好,思路很直观
16-
// 以[]内的为递归对象
17-
public String decodeString(String s) {
11+
// 耗时3ms,思路很直观,且不容易错,面试推荐写法
12+
public String decodeString2(String s) {
1813
StringBuilder sb = new StringBuilder();
19-
for (int i = 0; i < s.length(); i++) {
20-
char c = s.charAt(i);
2114

22-
if (c < '0' || c > '9') {
15+
for (char c : s.toCharArray()) {
16+
if (c != ']') {
2317
sb.append(c);
24-
continue;
18+
} else {
19+
String t = popString(sb);
20+
for (int i = popCount(sb); i > 0; i--) {
21+
sb.append(t);
22+
}
2523
}
24+
}
2625

27-
// 先解析数字
28-
int index = s.indexOf('[', i + 1);
29-
int digit = Integer.valueOf(s.substring(i, index));
30-
i = index + 1;
26+
return sb.toString();
27+
}
3128

32-
for (int count = 1; count != 0; i++) {
33-
if (s.charAt(i) == '[') {
34-
count++;
35-
} else if (s.charAt(i) == ']') {
36-
count--;
37-
}
38-
}
29+
private String popString(StringBuilder sb) {
30+
StringBuilder ss = new StringBuilder();
3931

40-
String str = decodeString(s.substring(index + 1, --i));
41-
for ( ; digit > 0; digit--, sb.append(str));
32+
int i = sb.length() - 1;
33+
for ( ; sb.charAt(i) != '['; i--) {
34+
ss.append(sb.charAt(i));
4235
}
36+
sb.setLength(i);
4337

44-
return sb.toString();
38+
return ss.reverse().toString();
4539
}
4640

47-
// 耗时4ms
48-
public String decodeString2(String s) {
49-
Stack<Integer> intStack = new Stack<Integer>();
50-
Stack<StringBuilder> strStack = new Stack<StringBuilder>();
51-
StringBuilder cur = new StringBuilder();
52-
for (int i = 0, digit = 0; i < s.length(); i++) {
53-
char c = s.charAt(i);
54-
if (c >= '0' && c <= '9') {
55-
digit = digit * 10 + (c - '0');
56-
} else if (c == '[') {
57-
intStack.push(digit);
58-
digit = 0;
59-
strStack.push(cur);
60-
cur = new StringBuilder();
61-
} else if (c == ']') {
62-
StringBuilder tmp = cur;
63-
cur = strStack.pop();
64-
for (int k = intStack.pop(); k > 0; k--) {
65-
cur.append(tmp);
66-
}
67-
} else {
68-
cur.append(c);
69-
}
41+
private int popCount(StringBuilder sb) {
42+
int i = sb.length() - 1, cnt = 0, t = 1;
43+
for ( ; i >= 0 && Character.isDigit(sb.charAt(i)); i--, t *= 10) {
44+
cnt += t * (sb.charAt(i) - '0');
7045
}
71-
return cur.toString();
46+
sb.setLength(i + 1);
47+
return cnt;
7248
}
7349
}
Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.example;
22

3+
import com.leetcode.google.DecodeString;
34
import com.leetcode.google.MissingRanges;
45
import com.leetcode.google.SentenceScreenFitting;
56
import com.leetcode.google.WordSquares;
@@ -12,12 +13,8 @@
1213
public class Main {
1314

1415
public static void main(String[] args) {
15-
List<String> list = new MissingRanges().findMissingRanges(new int[] {
16-
Integer.MIN_VALUE, Integer.MAX_VALUE
17-
}, Integer.MIN_VALUE, Integer.MAX_VALUE);
18-
for (String s : list) {
19-
System.out.println(s);
20-
}
16+
String s = new DecodeString().decodeString("10[ab]");
17+
System.out.println(s);
2118
}
2219
}
2320

0 commit comments

Comments
 (0)
X Tutup