@@ -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