por ejemplo, "ccddcc" en la cadena "abaccddccefe"
Pensé en una solución pero se ejecuta en el tiempo O (n ^ 2)
Algo 1:
Pasos: es un método de fuerza bruta
- Tener 2 bucles
for para i = 1 ai menos que array.length -1
para j = i + 1 a j menor que array.length - De esta manera, puede obtener una subcadena de cada combinación posible de la matriz
- Tener una función palíndromo que comprueba si una cuerda es palíndromo
- así que para cada subcadena (i, j) llame a esta función, si es un palíndromo guárdelo en una variable de cadena
- Si encuentra la siguiente subcadena de palíndromo y si es mayor que la actual, reemplácela por la actual.
- Finalmente su variable de cadena tendrá la respuesta
Problemas: 1. Este algoritmo se ejecuta en tiempo O (n ^ 2).
Algo 2:
- Invierta la cadena y guárdela en una matriz diferente
- Ahora encuentre la subcadena coincidente más grande entre la matriz
- Pero esto también se ejecuta en tiempo O (n ^ 2)
¿Pueden pensar en un algo que funcione en un mejor momento? Si es posible O (n) tiempo
algorithm
palindrome
Aprendiz
fuente
fuente
O(n^2)
obtener las subcadenas *O(n)
para verificar si son palíndromos, para un total deO(n^3)
?Respuestas:
¡Puedes encontrar el palíndromo más largo usando el algoritmo de Manacher a
O(n)
tiempo! Su implementación se puede encontrar aquí y aquí .Para la entrada
String s = "HYTBCABADEFGHABCDEDCBAGHTFYW1234567887654321ZWETYGDE"
, encuentra la salida correcta que es1234567887654321
.fuente
while
incrustado en elfor
con un límite que parece similar al bucle exterior.Es posible que Algo 2 no funcione para todas las cuerdas. A continuación se muestra un ejemplo de una cadena de este tipo "ABCDEFCBA".
No es que la cadena tenga "ABC" y "CBA" como subcadena. Si invierte la cadena original, será "ABCFEDCBA". y la subcadena coincidente más larga es "ABC", que no es un palíndromo.
Es posible que deba verificar adicionalmente si esta subcadena coincidente más larga es en realidad un palíndromo que tiene el tiempo de ejecución de O (n ^ 3).
fuente
Por lo que entendí el problema, podemos encontrar palíndromos alrededor de un índice central y abarcar nuestra búsqueda en ambos sentidos, a la derecha y a la izquierda del centro. Dado eso y sabiendo que no hay palíndromo en las esquinas de la entrada, podemos establecer los límites en 1 y longitud-1. Mientras prestamos atención a los límites mínimos y máximos de la Cadena, verificamos si los caracteres en las posiciones de los índices simétricos (derecha e izquierda) son los mismos para cada posición central hasta que alcanzamos nuestro centro de límite superior máximo.
El bucle exterior es O (n) (n-2 iteraciones máximas), y el bucle while interno es O (n) (máximo alrededor (n / 2) - 1 iteraciones)
Aquí está mi implementación de Java usando el ejemplo proporcionado por otros usuarios.
El resultado de esto es el siguiente:
fuente
expandAroundCenter
.con expresiones regulares y rubí, puede buscar palíndromos cortos como este:
fuente
He escrito el siguiente programa Java por curiosidad, HTH simple y autoexplicativo. Gracias.
fuente
Recientemente me hicieron esta pregunta. Esta es la solución que [eventualmente] se me ocurrió. Lo hice en JavaScript porque es bastante sencillo en ese idioma.
El concepto básico es caminar sobre la cuerda buscando el palíndromo de múltiples caracteres más pequeño posible (ya sea uno de dos o tres caracteres). Una vez que tengas eso, expande los bordes en ambos lados hasta que deje de ser un palíndromo. Si esa longitud es más larga que la actual, guárdelo y muévase.
Esto definitivamente podría limpiarse y optimizarse un poco más, pero debería tener un rendimiento bastante bueno en todos los escenarios excepto en el peor de los casos (una cadena de la misma letra).
fuente
i
j
l
s
if
mantenimiento de estado. puntos de retorno múltiple, casosHola Aquí está mi código para encontrar el palíndromo más largo de la cadena. Por favor, consulte el siguiente enlace para comprender el algoritmo http://stevekrenzel.com/articles/longest-palnidrome
Los datos de prueba utilizados son HYTBCABADEFGHABCDEDCBAGHTFYW12345678987654321ZWETYGDE
fuente
Consulte el artículo de Wikipedia sobre este tema. Ejemplo de implementación de Java del algoritmo de Manacher para la solución lineal O (n) del artículo siguiente:
fuente
Una
Regexp
solución eficaz que evita la fuerza brutaComienza con toda la longitud de la cadena y funciona hacia abajo hasta 2 caracteres, existe tan pronto como se hace una coincidencia
Para
"abaccddccefe"
las pruebas de expresiones regulares, 7 coincidencias antes de regresarccddcc
.vbs
vba
función
fuente
fuente
Pruebe la cadena - "HYTBCABADEFGHABCDEDCBAGHTFYW123456789987654321ZWETYGDE"; Debería funcionar para amigos pares e impares. ¡Muchas gracias a Mohit!
usando el espacio de nombres std;
fuente
isPal
, una operación O (n), solo para medir su longitud? También tiene un intento fallido de manejar incluso palíndromos. Sobre errores de palíndromo par:else if(input_str[i] == input_str[j])
nunca puede tener éxito porque esa misma prueba debe haber fallado en laif
declaración anterior ; y de todos modos tiene errores porque no se puede saber con solo mirar 2 caracteres espaciados en 2 posiciones si estás mirando un palíndromo par o uno impar (consideraAAA
yAAAA
).El siguiente código calcula Palidrom para cadenas de longitud par e impar.
No es la mejor solución, pero funciona para ambos casos.
HYTBCABADEFGHABCDEDCBAGHTFYW12345678987654321ZWETYGDE HYTBCABADEFGHABCDEDCBAGHTFYW1234567887654321ZWETYGDE
fuente
Podemos encontrar todos los palíndromos de todas las longitudes usando esto.
Muestra:
palabra = abcdcbc
modifiedString = a # b # c # d # c # b # c
palinCount = 1010105010301
longitud del palíndromo más largo = 5;
palíndromo más largo = bcdcb
public class MyLongestPalindrome {
}
fuente
Esto devolverá la cadena palíndromo más larga de la cadena dada
== SALIDA ===
Entrada: abcccde Salida: ccc
Entrada: abcccbd Salida: bcccb
Entrada: abedccde Salida: edccde
Entrada: abcccdeed Salida: escritura
Entrada: abcccbadeed Salida: abcccba
fuente
Aquí hay una implementación en javascript:
fuente
Para una solución lineal, puede utilizar el algoritmo de Manacher. Hay otro algoritmo llamado Algoritmo de Gusfield, y a continuación se muestra el código en Java:
Puede encontrar más sobre otras soluciones, como la mejor solución O (n ^ 2) o el algoritmo de Manacher de mi propio blog .
fuente
Aquí he escrito una lógica, pruébalo :)
fuente
Esta solución es de complejidad O (n ^ 2). O (1) es la complejidad del espacio.
fuente
{'DED': 3, '123456789987654321': 18, '67899876': 8, 'ABCDEDCBA': 9, '456789987654': 12, '34567899876543': 14, 'BCDEDCB': 7, 'ABA': 3, ' 5678998765 ': 10,' 2345678998765432 ': 16,' CDEDC ': 5,' 789987 ': 6,' 8998 ': 4} (' 123456789987654321 ', 18)
fuente
Aquí está mi algoritmo:
1) establece el centro actual para que sea la primera letra
2) expanda simultáneamente hacia la izquierda y hacia la derecha hasta que encuentre el palíndromo máximo alrededor del centro actual
3) si el palíndromo que encuentra es más grande que el palíndromo anterior, actualícelo
4) establece el centro actual para que sea la siguiente letra
5) repita los pasos 2) a 4) para todas las letras de la cadena
Esto se ejecuta en O (n).
Espero eso ayude.
fuente
Referencia: Wikipedia.com
El mejor algoritmo que he encontrado, con complejidad O (N)
fuente
mi solución es:
fuente
Substring()
y cadena-igualdad (==
). Es básicamente idéntico al algoritmo # 1 del OP.