La subcadena repetida más larga en Java
Se nos dieron instrucciones para escribir un programa que acepta una cadena como entrada y calcula e imprime la subcadena más larga que se muestra dos veces sin solapamiento (ver el quinto ejemplo para solapamiento). Si hay más de una subcadena de este tipo, el programa muestra la primera que encuentra, así como el número de caracteres de la subcadena. Si no hay ninguna subcadena que aparezca dos veces, entonces el programa no imprime nada. Los ejemplos que nos dieron sobre cómo debería verse la salida son los siguientes:
Primer ejemplo
Dame una cadena: otra vez y otra vez
Subcadena más larga: otra
Tamaño de la subcadena más larga: 4
Segundo ejemplo
Dame una cadena: siete santos y siete cenas
Subcadena más larga: siete
Tamaño de la subcadena más larga: 5
Nota: La respuesta completa el espacio y tiene 5 caracteres.
Tercer ejemplo
Dame una cadena: Siete santos y siete pecadores
Subcadena más larga: even s
Tamaño de la subcadena más larga: 6
Cuarto ejemplo
Dame una cadena: María tenía un corderito
Subcadena más larga: l
Tamaño de la subcadena más larga: 2
Quinto ejemplo
Dame una cadena: carreracarreracarrearace
Subcadena más larga: carreracarrearace
Tamaño de la subcadena más larga: 18
Mi código hasta ahora es el siguiente, y no funciona, ya que la pantalla de salida está vacía y cuando intenté imprimir la Lista de Arrays, solo mostró [null]. ¿Qué hay mal en él y cómo se puede hacer que funcione?
import java.util.Arrays;
import java.util.ArrayList;
public class substring {
public static void main(String[] args) {
String string = args[0];
ArrayList<string> longestSubstring=new ArrayList<string>();
String substring;
for (int firstcharacter=0; firstcharacter<string.length()-1; firstcharacter++)="" {="" for(int="" secondcharacter="firstcharacter+1;"></string.length()-1;><string.length()-1; secondcharacter++)="" {="" substring="string.substring(firstcharacter,secondcharacter);" for="" (int="" i="substring.length()+1;"></string.length()-1;><string.length()-1; i++) {
string firsttwo=string.valueof(string.charat(i)+string.charat(i+1));
if (substring==firsttwo) {
longestsubstring.add(substring);
}
}
}
}
for(int i = 0; i < longestsubstring.size(); i++) {
system.out.print(longestsubstring.get(i));
}
}
} i++)=”” {=”” string=”” firsttwo=”String.valueOf(string.charAt(i)+string.charAt(i+1));” if=”” (substring=”=firsttwo)” {=”” longestsubstring.add(substring);=”” }=”” }=”” }=”” }=”” for(int=”” i=”0;” i=”” <=”” longestsubstring.size();=”” i++)=”” {=”” system.out.print(longestsubstring.get(i));=”” }=”” }=””></string.length()-1; i++) {
string firsttwo=string.valueof(string.charat(i)+string.charat(i+1));
if (substring==firsttwo) {
longestsubstring.add(substring);
}
}
}
}
for(int i = 0; i < longestsubstring.size(); i++) {
system.out.print(longestsubstring.get(i));
}
}
}>
davy.ai
Solución
El código tiene varios problemas que impiden que funcione correctamente. Aquí están algunos de los más importantes:
primeerCaracter + 1
, pero debería empezar desdeprimerCaracter + 2
.i
comienza desdesubcadena.length() + 1
, pero debería empezar desdesegundoCaracter + 1
.subcadena == primerosDos
debería usar el métodoequals()
en lugar de==
.string.length()
, no enstring.length() - 1
.Aquí está el código corregido:
Los cambios anteriores corrigen las condiciones de los bucles y los problemas de comparación. Además, el código ahora verifica si la lista
subcadenasMasLargas
está vacía antes de intentar encontrar la subcadena más larga. Finalmente, el código imprime correctamente el resultado usandoSystem.out.println()
.