es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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));
    }  
}

}>

Tags:  ,

Answer

  1. Avatar for davy.ai

    Solución

    El código tiene varios problemas que impiden que funcione correctamente. Aquí están algunos de los más importantes:

    • El bucle para el segundo carácter comienza desde primeerCaracter + 1, pero debería empezar desde primerCaracter + 2.
    • El bucle para i comienza desde subcadena.length() + 1, pero debería empezar desde segundoCaracter + 1.
    • La comparación subcadena == primerosDos debería usar el método equals() en lugar de ==.
    • El bucle para el segundo carácter debería terminar en string.length(), no en string.length() - 1.

    Aquí está el código corregido:

    import java.util.ArrayList;
    
    public class subcadena {
    
        public static void main(String[] args) {
            String string = args[0];
            ArrayList<string> subcadenasMasLargas = new ArrayList<string>();
            String subcadena;
    
            for (int primerCaracter = 0; primerCaracter < string.length() - 1; primerCaracter++) {
                for (int segundoCaracter = primerCaracter + 2; segundoCaracter <= string.length(); segundoCaracter++) {
                    subcadena = string.substring(primerCaracter, segundoCaracter);
    
                    for (int i = segundoCaracter; i < string.length() - 1; i++) {
                        String primerosDos = String.valueOf(string.charAt(i)) + String.valueOf(string.charAt(i + 1));
                        if (subcadena.equals(primerosDos)) {
                            subcadenasMasLargas.add(subcadena);
                            break;
                        }
                    }
                }
            }
    
            if (subcadenasMasLargas.isEmpty()) {
                return;
            }
    
            String resultado = subcadenasMasLargas.get(0);
            for (String candidata : subcadenasMasLargas) {
                if (candidata.length() > resultado.length()) {
                    resultado = candidata;
                }
            }
    
            System.out.println("Subcadena más larga: " + resultado);
            System.out.println("Tamaño de la subcadena más larga: " + resultado.length());
        }
    }
    

    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 usando System.out.println().

Comments are closed.