-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathBurrowsWheeler.java
More file actions
70 lines (57 loc) · 1.87 KB
/
BurrowsWheeler.java
File metadata and controls
70 lines (57 loc) · 1.87 KB
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
import edu.princeton.cs.algs4.BinaryStdIn;
import edu.princeton.cs.algs4.BinaryStdOut;
import java.util.Arrays;
public class BurrowsWheeler {
// apply Burrows-Wheeler transform, reading from standard input and writing to standard output
public static void transform() {
String input = BinaryStdIn.readString();
CircularSuffixArray circularSuffixArray = new CircularSuffixArray(input);
int length = circularSuffixArray.length();
StringBuilder transformString = new StringBuilder();
int first=0;
for (int i=0; i<circularSuffixArray.length(); i++) {
int index = circularSuffixArray.index(i);
if (circularSuffixArray.index(i) == 0) {
first = i;
}
transformString.append(input.charAt((index-1 + length)%length));
}
BinaryStdOut.write(first);
BinaryStdOut.write(transformString.toString());
BinaryStdOut.close();
}
// apply Burrows-Wheeler inverse transform, reading from standard input and writing to standard output
public static void inverseTransform() {
int first = BinaryStdIn.readInt();
String message = BinaryStdIn.readString();
int length = message.length();
int next[] = new int[length];
char prefix[] = message.toCharArray();
int last[] = new int[256];
Arrays.sort(prefix);
// construct next
for (int i=0; i<length; i++) {
int index = message.indexOf(prefix[i], last[prefix[i]]);
next[i] = index;
last[prefix[i]] = index+1;
}
// inverse
StringBuilder origin = new StringBuilder();
for (int i=0; i<length; i++) {
origin.append(prefix[first]);
first = next[first];
}
BinaryStdOut.write(origin.toString());
BinaryStdOut.close();
}
// if args[0] is '-', apply Burrows-Wheeler transform
// if args[0] is '+', apply Burrows-Wheeler inverse transform
public static void main(String[] args) {
if (args[0].compareTo("-") == 0) {
transform();
}
if (args[0].compareTo("+") == 0) {
inverseTransform();
}
}
}