¿Dónde se puede encontrar una implementación de árbol de sufijos de la subcadena común más larga?

A continuación se muestra la implementación de Java de su pregunta … Espero que ayude.

Para más información … visita,

SuffixArray.java

import java Resources and Information .. *;

import java.util. *;

import java.text. *;

import java.math. *;

import java.util.regex. *;

import java.util.Arrays. *;

import java Resources and Information..BufferedReader;

import java Resources and Information..IOException;

import java Resources and Information..InputStreamReader;

Solución de clase pública

{Public static class SuffixArray {

sufijos de sufijo privado [];

public SuffixArray (texto de cadena) {

int n = text.length ();

this.suffixes = nuevo sufijo [n];

para (int i = 0; i <n; i ++)

sufijos [i] = nuevo sufijo (texto, i);

Arrays.sort (sufijos);

}

El sufijo de clase implementa Comparable {

texto de cadena final privado;

índice int final privado;

Sufijo privado (texto de cadena, índice int) {

this.text = text;

this.index = index;

}

private int length () {

return text.length () – índice;

}

char privado charAt (int i) {

return text.charAt (índice + i);

}

public int compareTo (Sufijo que) {

if (this == that) devuelve 0; // optimización

int n = Math.min (this.length (), that.length ());

para (int i = 0; i <n; i ++) {

if (this.charAt (i) <that.charAt (i)) devuelve -1;

if (this.charAt (i)> that.charAt (i)) devuelve +1;

}

devuelve this.length () – that.length ();

}

public String toString () {

return text.substring (index);

}

}

public int length () {

return sufixes.length;

}

índice int público (int i) {

if (i = suffixes.length) arroja un nuevo IndexOutOfBoundsException ();

devolver sufijos [i] .index;

}

public int lcp (int i) {

if (i = suffixes.length) arroja un nuevo IndexOutOfBoundsException ();

return lcp (sufijos [i], sufijos [i-1]);

}

int lcp (sufijo s, sufijo t) {

int n = Math.min (s.length (), t.length ());

para (int i = 0; i <n; i ++) {

if (s.charAt (i)! = t.charAt (i)) devuelve i;

}

volver n;

}

public String select (int i) {

if (i = suffixes.length) arroja un nuevo IndexOutOfBoundsException ();

devolver sufijos [i] .toString ();

}

public int rank (consulta de cadena) {

int lo = 0, hi = sufijos.length – 1;

while (lo <= hi) {

int mid = lo + (hi – lo) / 2;

int cmp = compare (consulta, sufijos [mediados]);

if (cmp <0) hi = mid – 1;

si no (cmp> 0) lo = mid + 1;

de lo contrario volver a mediados;

}

volver lo;

}

int compare (consulta de cadena, sufijo de sufijo) {

int n = Math.min (query.length (), suffix.length ());

para (int i = 0; i <n; i ++) {

if (query.charAt (i) <suffix.charAt (i)) devuelve -1;

if (query.charAt (i)> suffix.charAt (i)) devuelve +1;

}

return query.length () – sufijo.length ();

}

}

public static String lcp (String s, int p, String t, int q) {

int n = Math.min (s.length () – p, t.length () – q);

para (int i = 0; i <n; i ++) {

if (s.charAt (p + i)! = t.charAt (q + i))

devuelve la subcadena (p, p + i);

}

return s.substring (p, p + n);

}

public static int compare (Cadena s, int p, Cadena t, int q) {

int n = Math.min (s.length () – p, t.length () – q);

para (int i = 0; i <n; i ++) {

if (s.charAt (p + i)! = t.charAt (q + i))

devuelve s.charAt (p + i) – t.charAt (q + i);

}

if (s.length () – p <t.length () – q) devuelve -1;

si no (s.length () – p> t.length () – q) devuelve +1;

de lo contrario, devuelve 0;

}

Cadena estática pública lcs (Cadena s, Cadena t) {

SuffixArray suffix1 = new SuffixArray (s);

SuffixArray suffix2 = new SuffixArray (t);

String lcs = “”;

int i = 0, j = 0;

while (i <s.length () && j <t.length ()) {

int p = sufijo1.index (i);

int q = sufijo2.index (j);

Cadena x = lcp (s, p, t, q);

if (x.length ()> lcs.length ()) lcs = x;

if (compare (s, p, t, q) <0) i ++;

de lo contrario j ++;

}

devolver lcs;

}

public static void main (String [] args) {

Escáner en = nuevo escáner (System.in);

Cadena a = in.next ();

Cadena b = in.next ();

int resultado = lcs (a, b) .length ();

System.out.println (resultado);

}

}