Un palíndromo es una palabra, frase, número u otra secuencia de unidades que se puede leer de la misma manera en cualquier dirección.
Para comprobar si una palabra es un palíndromo, obtengo la matriz de caracteres de la palabra y comparo los caracteres. Lo probé y parece funcionar. Sin embargo quiero saber si está bien o si hay algo que mejorar.
Aquí está mi código:
public class Aufg1 {
public static void main(String[] args) {
String wort = "reliefpfpfeiller";
char[] warray = wort.toCharArray();
System.out.println(istPalindrom(warray));
}
public static boolean istPalindrom(char[] wort){
boolean palindrom = false;
if(wort.length%2 == 0){
for(int i = 0; i < wort.length/2-1; i++){
if(wort[i] != wort[wort.length-i-1]){
return false;
}else{
palindrom = true;
}
}
}else{
for(int i = 0; i < (wort.length-1)/2-1; i++){
if(wort[i] != wort[wort.length-i-1]){
return false;
}else{
palindrom = true;
}
}
}
return palindrom;
}
}
Respuestas:
Por qué no solo:
Ejemplo:
La entrada es "andna".
i1 será 0 e i2 será 4.
Primera iteración de bucle que compararemos
word[0]
yword[4]
. Son iguales, así que incrementamos i1 (ahora es 1) y disminuimos i2 (ahora es 3).Entonces comparamos las n. Son iguales, así que incrementamos i1 (ahora es 2) y disminuimos i2 (es 2).
Ahora i1 e i2 son iguales (ambos son 2), por lo que la condición para el ciclo while ya no es verdadera, por lo que el ciclo termina y devolvemos verdadero.
fuente
Puede comprobar si una cuerda es un palíndromo comparándola con el reverso de sí misma:
o para versiones de Java anteriores a la 1.5,
EDITAR: @FernandoPelliccioni proporcionó un análisis muy completo de la eficiencia (o falta de ella) de esta solución, tanto en términos de tiempo como de espacio. Si está interesado en la complejidad computacional de esta y otras posibles soluciones a esta pregunta, ¡léala!
fuente
Una versión concisa, que no implica (de manera ineficiente) inicializar un montón de objetos:
fuente
Alternativamente, recursividad .
Para cualquiera que esté buscando una solución recursiva más corta, para verificar si una cadena dada satisface como palíndromo:
O incluso más corto , si lo desea:
fuente
return s.charAt(0) == s.charAt(l - 1) && isPalindrome(s.substring(1, l - 1));
Vaya, Java:
fuente
también una solución de aspecto diferente:
fuente
Y aquí una completa solución de transmisión de Java 8 . Un IntStream proporciona todos los índices hasta la mitad de la longitud de las cadenas y luego se realiza una comparación desde el principio y desde el final.
La salida es:
fuente
allMatch
conallMatch(i -> str.charAt(i) == str.charAt(str.length() - i - 1))
?fuente
isPalindrome()
con"cbb"
?}
fuente
Trabajé en una solución para una pregunta que estaba marcada como duplicada de esta. Bien podría tirarlo aquí ...
La pregunta solicitó una sola línea para resolver esto, y la tomé más como el palíndromo literario, por lo que los espacios, la puntuación y las mayúsculas / minúsculas pueden alterar el resultado.
Aquí está la fea solución con una pequeña clase de prueba:
Lamento que sea un poco desagradable, pero la otra pregunta especificó una sola línea.
fuente
Verificando palíndromo para la primera mitad de la cadena con el resto, este caso asume la eliminación de cualquier espacio en blanco.
fuente
Soy nuevo en Java y acepto su pregunta como un desafío para mejorar mis conocimientos.
fuente
Probar esto :
fuente
fuente
Otra forma es usar char Array
}
fuente
Aquí mi análisis de la respuesta de @Greg: componentsprogramming.com/palindromes
Nota al margen: Pero, para mí, es importante hacerlo de forma genérica . Los requisitos son que la secuencia sea iterable bidireccionalmente y que los elementos de la secuencia sean comparables utilizando la igualdad. No sé cómo hacerlo en Java, pero aquí hay una versión de C ++, no conozco una mejor manera de hacerlo para secuencias bidireccionales.
Complejidad: tiempo lineal,
Si I es RandomAccessIterator: piso (n / 2) comparaciones y piso (n / 2) * 2 iteraciones
Si I es BidirectionalIterator: comparaciones de piso (n / 2) y piso (n / 2) * 2 iteraciones más (3/2) * n iteraciones para encontrar el medio (función del medio)
almacenamiento: O (1)
Sin memoria asignada dinámica
fuente
Recientemente escribí un programa palindrome que no usa StringBuilder. Una respuesta tardía, pero esto puede resultar útil para algunas personas.
fuente
Usando la pila, se puede hacer así
fuente
fuente
¡Increíble cuántas soluciones diferentes para un problema tan simple existen! Aqui hay otro más.
fuente
fuente
Por qué no solo:
fuente
fuente
fuente
Estaba buscando una solución que no solo funcionara para palíndromos como ...
... pero también para ...
Iterativo : se ha demostrado que es una buena solución.
Recursivo . Creo que esta solución no debería ser mucho peor que la iterativa. Es un poco cutre, necesitamos extraer el paso de limpieza del método para evitar procesamientos innecesarios.
Inversión : se ha demostrado que es una solución cara.
Todos los créditos para los chicos que respondieron en esta publicación y aclararon el tema.
fuente
Considerando no letras en las palabras
———
fuente
Aquí puede comprobar palíndromo una serie de cadenas de forma dinámica
fuente
En mi opinión, la forma recursiva es la más simple y clara.
fuente
aquí, buscando el palíndromo más grande de una cadena, siempre comenzando desde el primer carácter.
fuente
Fragmento de código:
fuente