【发布时间】:2018-06-09 04:17:15
【问题描述】:
import java.util.Arrays;
import java.util.Scanner;
public class SuffixArray {
public static class Tuple implements Comparable<Tuple>{
public Integer originalIndex;
public Integer firstHalf;
public Integer secondHalf;
@Override
public int compareTo(Tuple o) {
if(this.firstHalf.compareTo(o.firstHalf)==0){
return this.secondHalf.compareTo(o.secondHalf);
}else {
return this.firstHalf.compareTo(o.firstHalf);
}
}
}
public static void main(String args[]){
Scanner scanner = new Scanner(System.in);
String input = scanner.next();
int n = input.length();
Tuple[] tuples = new Tuple[n];
int[][] suffixRank = new int[100][100];
for (int i = 0; i < n; i++){
tuples[i] = new Tuple();
suffixRank[0][i] = input.charAt(i) - 'a';
}
for(int step=1, count=1;count < n;count*=2, step++){
for (int i = 0; i<n;i++){
tuples[i].firstHalf = suffixRank[step-1][i];
tuples[i].secondHalf = i + count < n ? suffixRank[step-1][i+count] : -1;
tuples[i].originalIndex = i;
}
Arrays.sort(tuples);
for (int i=0;i<n;i++){
suffixRank[step][tuples[i].originalIndex] = i > 0 && tuples[i].firstHalf == tuples[i-1].firstHalf && tuples[i].secondHalf==tuples[i-1].secondHalf ? suffixRank[step][tuples[i].originalIndex] : i;
}
}
for (int i=0;i<n;i++){
System.out.print(tuples[i].originalIndex + " ");
}
}
}
上面的程序是一个使用nlogn算法的后缀数组。我从资源中应用了相同的算法,该资源是下面发布的链接。如果我在 C++ 中应用相同的算法,它可以正常工作,但是当我在 Java 中应用相同的代码时,它会给我错误的输出。它给了我错误的元组索引。我无法弄清楚这段代码有什么问题,所以请帮助我。
测试用例 1:
输入:abaab 输出:3 2 0 4 1 预期输出:2 3 0 4 1
测试用例 2:
输入:香蕉 输出:4 5 3 1 0 2 预期输出:5 3 1 0 4 2
【问题讨论】:
-
很难说你为什么认为这不起作用。您能否举例说明您提供的一些输入、您期望的输出以及您实际获得的输出?
标签: java algorithm data-structures suffix-array