Skip to content

Commit d636d56

Browse files
renamed method variables and reformatted code.
1 parent 7d427f5 commit d636d56

File tree

1 file changed

+21
-24
lines changed

1 file changed

+21
-24
lines changed

src/main/java/com/thealgorithms/strings/SuffixArray.java

Lines changed: 21 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -18,49 +18,46 @@ private SuffixArray() {
1818
public static int[] buildSuffixArray(String text) {
1919
int n = text.length();
2020
Integer[] suffixArray = new Integer[n];
21-
int[] rank = new int[n];
22-
int[] tempRank = new int[n];
21+
int[] currentRank = new int[n];
22+
int[] nextRank = new int[n];
2323

2424
// Initial ranking based on characters
2525
for (int i = 0; i < n; i++) {
2626
suffixArray[i] = i;
27-
rank[i] = text.charAt(i);
27+
currentRank[i] = text.charAt(i);
2828
}
2929

30-
for (int k = 1; k < n; k *= 2) {
31-
final int step = k;
32-
33-
sortSuffixArray(suffixArray, rank, step, n);
30+
for (int prefixLength = 1; prefixLength < n; prefixLength *= 2) {
31+
sortSuffixArray(suffixArray, currentRank, prefixLength, n);
3432

3533
// Re-rank
36-
tempRank[suffixArray[0]] = 0;
34+
nextRank[suffixArray[0]] = 0;
3735
for (int i = 1; i < n; i++) {
38-
int prev = suffixArray[i - 1];
39-
int curr = suffixArray[i];
40-
boolean sameRank = rank[prev] == rank[curr] && ((prev + step < n ? rank[prev + step] : -1) == (curr + step < n ? rank[curr + step] : -1));
41-
tempRank[curr] = sameRank ? tempRank[prev] : tempRank[prev] + 1;
36+
int previousIndex = suffixArray[i - 1];
37+
int currentIndex = suffixArray[i];
38+
boolean sameRank = currentRank[previousIndex] == currentRank[currentIndex] && ((previousIndex + prefixLength < n ? currentRank[previousIndex + prefixLength] : -1) == (currentIndex + prefixLength < n ? currentRank[currentIndex + prefixLength] : -1));
39+
nextRank[currentIndex] = sameRank ? nextRank[previousIndex] : nextRank[previousIndex] + 1;
4240
}
4341

44-
System.arraycopy(tempRank, 0, rank, 0, n);
42+
System.arraycopy(nextRank, 0, currentRank, 0, n);
4543

46-
if (rank[suffixArray[n - 1]] == n - 1) {
44+
if (currentRank[suffixArray[n - 1]] == n - 1) {
4745
break;
4846
}
4947
}
5048
return Arrays.stream(suffixArray).mapToInt(Integer::intValue).toArray();
5149
}
5250

53-
private static Integer[] sortSuffixArray(Integer[] suffixArray, int[] rank, int step, int n) {
54-
// Comparator: first by rank, then by rank + step
55-
Arrays.sort(suffixArray, (a, b) -> {
56-
if (rank[a] != rank[b]) {
57-
return Integer.compare(rank[a], rank[b]);
51+
private static void sortSuffixArray(Integer[] suffixArray, int[] currentRank, int comparisonLength, int n) {
52+
// Comparator: first by rank, then by rank + comparisonLength
53+
Arrays.sort(suffixArray, (indexA, indexB) -> {
54+
if (currentRank[indexA] != currentRank[indexB]) {
55+
return Integer.compare(currentRank[indexA], currentRank[indexB]);
5856
}
59-
int ra = (a + step < n) ? rank[a + step] : -1;
60-
int rb = (b + step < n) ? rank[b + step] : -1;
61-
return Integer.compare(ra, rb);
57+
int rankAtOffsetA = (indexA + comparisonLength < n) ? currentRank[indexA + comparisonLength] : -1;
58+
int rankAtOffsetB = (indexB + comparisonLength < n) ? currentRank[indexB + comparisonLength] : -1;
59+
return Integer.compare(rankAtOffsetA, rankAtOffsetB);
6260

63-
});
64-
return suffixArray;
61+
});
6562
}
6663
}

0 commit comments

Comments
 (0)