A continuación se muestra la implementación de Java de su pregunta … Espero que ayude.
Para más información … visita,
SuffixArray.java
- Cómo analizar los detalles del problema en el concurso de codificación
- ¿Cómo funciona el algoritmo de Amazon?
- Cómo aprender estructuras de datos y algoritmos de manera efectiva para que pueda ser mejor en la programación competitiva a nivel principiante
- ¿Cuál es el mejor libro de texto en línea gratuito para Algorithm an Data Structure? Me refiero a un libro de texto para un estudiante principiante en la universidad.
- Cómo escanear una lista de números en una sola línea separada con un espacio y agregarlos a una lista en Python
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);
}
}