代码之家  ›  专栏  ›  技术社区  ›  Rich

后缀数组的Java实现

  •  1
  • Rich  · 技术社区  · 14 年前

    在C语言中,我可能会这样做:

    char exampleText[MAX];
    char *suffixArray[MAX];
    ...
    while(n<MAX && suffixArray[n++] = &exampleText[n]);
    sort(suffixArray);
    

    这在Java中变得很棘手,因为我必须接受 exampleText ,或转弯 suffixArray

    有什么好的Java方法的建议吗?

    3 回复  |  直到 14 年前
        1
  •  2
  •   Tom Hawtin - tackline    14 年前

    String 会[通常]为你这样做(使用创建时,典型的实现共享备份阵列 substring ,但随时可能更改。)

        2
  •  1
  •   jogojapan    12 年前

    对于那些对在Java中更有效地构造后缀数组感兴趣的人,我曾经使用过一个名为 jsuffixarrays . 代码是 here

    import org.jsuffixarrays.Algorithm;
    import org.jsuffixarrays.ISuffixArrayBuilder;
    import org.jsuffixarrays.SuffixArrays;
    import org.jsuffixarrays.SuffixData;
    
    String              exampleText = "....";
    ISuffixArrayBuilder suxBuilder  = Algorithm.SKEW.getDecoratedInstance();
    SuffixData          sux         = SuffixArrays.createWithLCP(text,sux_builder);
    
    /* Then, to access the suffix array: */
    sux.getSuffixArray();
    /* And, to access the LCP array: */
    sux.getLCP();
    

    如果您不需要LCP阵列,您可以构建它。

        3
  •  1
  •   user2271868 user2271868    11 年前

    您可以从后缀数组中生成一些变体:

    public static String[] suffixes(String s)
    {
    int N = s.length();
    String[] suffixes = new String[N];
    for (int i = 0; i < N; i++)
    suffixes[i] = s.substring(i, N);
    return suffixes;
    }
    

    第二:

    public static String[] suffixes(String s)
    {
    int N = s.length();
    StringBuilder sb = new StringBuilder(s);
    String[] suffixes = new String[N];
    for (int i = 0; i < N; i++)
    suffixes[i] = sb.substring(i, N);
    return suffixes;
    }