Cómo encontrar todos los palíndromos posibles que se pueden generar usando las letras de una cadena dada

Supongo que el idioma es el inglés para la entrada y estoy imprimiendo todas las impresiones posibles usando caracteres que dependen de su uso de distintos, para palíndromos distintos use un conjunto para los resultados.

Entonces, hablemos primero de los palíndromos, son simétricos acerca de sus centros, ya sea alrededor de una letra en el ejemplo del medio abbbbcbbbba que se centra alrededor de c o como abba que se centra entre la mitad de la longitud de la cadena.

Cosas a tener en cuenta de esto:

1.) Cada Palindrome que se centra en la mitad de la longitud tiene alrededor de un número par de letras.

2.) Cada Palindrome que se centra alrededor de una letra en la posición central contiene una letra omitida (es decir, una letra que no se usa en la cadena si puede ser par y no se usa en la cadena O contada impar ) concatenada entre la mitad de la longitud de palíndromo que se centra alrededor de la mitad de la longitud. Ex abcba se hace concatenando entre la letra c y la abba .

3.) podemos crear un palíndromo con la mitad de una cuerda.


Entonces, crearíamos todas las cadenas de números pares y luego concatenaríamos todas las letras que no se usan en la cadena.

La solución :

1.) Cree un hashmap que mapee el recuento de la letra.

2.) Cree un conjunto de caracteres char_set que contenga para cada par de caracteres (es decir, 2 de carácter específico) un nuevo elemento de ese carácter. reducir el recuento en hash-map por 2.

3.) un resultado de matriz que contiene el resultado de su concatenación.

4.) Inicialmente el resultado contiene una cadena nula.

5.) ahora para cada elemento en char_set lo concatena con cada elemento presente en el resultado y luego agrega el elemento resultante en el resultado.

6.) Ahora tiene un resultado que contiene cada palíndromo de longitud uniforme con todos los caracteres omitidos sin otro carácter del mismo tipo para emparejarse con un conteo de 1 en el mapa hash (es decir, caracteres contados impares).

7.) Ahora, para cada cadena de elementos S en el resultado, imprima tres cadenas (+ representa la concatenación y realice estas operaciones para cada permutación de S):

  • S + reverso de (S) (incluso palíndromo de longitud ed)
  • S (último carácter omitido) + reverso de (S) (con el último carácter omitido para crear un palíndromo de longitud impar con caracteres contados pares)
  • por cada carácter contado impar U en la impresión de mapa hash S + U + reverso de S (palíndromo de longitud impar con letras contadas impares en el medio)

para palindromes distintos, el resultado de la tienda es un SET.

Espero que esta simple solución ayude.

Comenta si necesitas un algoritmo

#include
#include

usando el espacio de nombres estándar;

Nodo de estructura {
string str;
Nodo * siguiente;
} * arriba, * guardar;

intolist vacío (cadena a) {
Nodo * newptr = nuevo nodo;
newptr-> str = a;
newptr-> next = NULL;
if (top == NULL) top = newptr;
más{
guardar = arriba;
top = newptr;
arriba-> siguiente = guardar;
}
}

int strlen (cadena a) {
int i;
para (i = 0; a [i]! = ‘\ 0’; ++ i);
volver i;
}

bool pallindrome (string string1) {

int longitud = strlen (cadena1);
int i;
bandera de bool = verdadero;
para (i = 0; i if (cadena1 [i]! = cadena1 [longitud-i-1]) {
bandera = falso;
descanso;
}
}

bandera de regreso;
}

int main () {
cuerda a;
cin >> a;
int i = 0, longitud = strlen (a), j, k, l;

while (i <(longitud-1)) {
k = i + 1;
mientras que (k char * str = nuevo char [(ki) +1];
j = i;
l = 0;
mientras que (j <= k) {
str [l] = a [j];
++ l;
++ j;
}
str [l] = ‘\ 0’;
if (pallindrome (str)) {
intolista (str);
}
eliminar str;
++ k;
}
++ i;
}

guardar = arriba;

while (save! = NULL) {

cout << save-> str << "";
guardar = guardar-> siguiente;
}
devuelve 0;
}

La forma más sencilla sería generar todas las cadenas posibles utilizando todos los caracteres uno por uno.

Abc de ejemplo

1) a

2) ab, ba

3) cabina, acb, abc, cba, bca, bac

Complejidad : n! (esto será lo menos posible ya que podría haber n! salidas)

Oye, si s, t, r, I, n, g no pueden repetirse, entonces no es posible el palintromo, pero si pueden repetirse, primero S, t, r, n, g y luego la palabra de 2 letras posible palintrome es ss, tt, rr , ii, nn, gg, es decir, 6 y si se debe verificar el palintromo de 3 letras, entonces el posible palintromo es 36 como sss, ttt … Al igual que 6 y sts, es decir, las letras finales son iguales y la letra del medio varía, por lo que las posibilidades son 6 × 5 × 1, es decir, 30 y el palintromo total en palabra de 3 letras es 36 ahora ve la secuencia

1 letra palabra palintromes posibles son 6

Palabra de 2 letras: 6

Palabra de 3 letras: 6 elevar al poder 2

Palabra de 4 letras: 6 elevar al poder 2 como

Las cuatro letras son s, s, s, s, por lo que tales posibilidades son 6 y las posibilidades como stts son 6 × 5, es decir, 30

Palabra de 5 letras: 6 elevar a potencia 3 es decir (sssss tales posibilidades son 6 y sttts posibilidades son 6 × 5 ie 30 y sstss posibilidades son 30 y ststs es 30 y posibilidades para strts posibilidad son 6 × 5 × 4 ie 120 así que total son 216

De manera similar, las posibilidades de palabras de 6 letras son 6 elevar al poder 3

Entonces, para siete 6 subir al poder 4

Y ver el patrón

Entonces el infinito es la solución

En primer lugar, necesitaría especificar “usar las letras de una cadena dada”.

¿Significa usar cada carácter al menos una vez o exactamente tantas veces como aparece en la cadena dada?

En el primer caso, habría un número infinito de palíndromos: el lema de Google Pumping para lenguajes libres de contexto . Y eso me lleva a la gramática libre de contexto que podría ayudarlo con el segundo caso. Especialmente cuando se trata de tomar una decisión sobre qué lenguaje de programación comienza con esta tarea (no estoy demasiado familiarizado con los funcionales, pero algunas reglas y recursiones me parecen buenas aquí).

No estoy seguro de si su pregunta es más teórica y, por lo tanto, está bien con mi respuesta hasta el momento o si realmente está pidiendo un código de trabajo que creo que puede encontrar en algún lugar (consejo aquí, observe la complejidad de tiempo asintótica de los algoritmos encontrados) de todos modos .

De una forma u otra, para mí esto parece ser un posible proyecto de tarea / escuela para hacer, así que mejor me detengo aquí para no estropear toda la diversión y dejar que alguien aprenda algo en su lugar 🙂