Quiero un algoritmo eficiente para encontrar la siguiente mayor permutación de la cadena dada.Algoritmo para encontrar la siguiente mayor permutación de una cadena dada
Respuesta
Wikipedia tiene un buen article en la generación de orden lexicográfico. También describe un algoritmo para generar la siguiente permutación.
Citando:
El siguiente algoritmo genera la siguiente permutación lexicográficamente después de una permutación dada. Cambia la permutación dada en el lugar.
- Encuentra el mayor índice
i
tal ques[i] < s[i+1]
. Si no existe tal índice, la permutación es la última permutación.- Encuentra el índice más alto
j > i
tal ques[j] > s[i]
. Talj
debe existir, ya quei+1
es dicho índice.- Intercambio
s[i]
cons[j]
.- Invierta el orden de todos los elementos después del índice
i
hasta el último elemento.
para aquellos que se preguntan por qué el paso 4 no es ordenar: el paso 1 ya implica que desde s [i + 1] hasta el final ya está en orden descendente, por lo tanto, invertir equivale a ordenar –
¿Deberes? De todos modos, puede mirar en el C++ función std :: next_permutation, o esto:
http://blog.bjrn.se/2008/04/lexicographic-permutations-using.html
Podemos encontrar la siguiente cadena más grande lexicográfico para una cadena dada S utilizando el siguiente paso.
1. Iterate over every character, we will get the last value i (starting from the first character) that satisfies the given condition S[i] < S[i + 1]
2. Now, we will get the last value j such that S[i] < S[j]
3. We now interchange S[i] and S[j]. And for every character from i+1 till the end, we sort the characters. i.e., sort(S[i+1]..S[len(S) - 1])
La cadena dada es la siguiente cadena lexicográfico más grande de S
. También se puede usar la llamada a la función next_permutation
en C++.
Espero que este código pueda ser útil.
int main() {
char str[100];
cin>>str;
int len=strlen(len);
int f=next_permutation(str,str+len);
if(f>0) {
print the string
} else {
cout<<"no answer";
}
}
Una gran solución que funciona se describe aquí: https://www.nayuki.io/page/next-lexicographical-permutation-algorithm. Y la solución que, si existe al lado de permutación, lo devuelve, de lo contrario devuelve false
:
function nextPermutation(array) {
var i = array.length - 1;
while (i > 0 && array[i - 1] >= array[i]) {
i--;
}
if (i <= 0) {
return false;
}
var j = array.length - 1;
while (array[j] <= array[i - 1]) {
j--;
}
var temp = array[i - 1];
array[i - 1] = array[j];
array[j] = temp;
j = array.length - 1;
while (i < j) {
temp = array[i];
array[i] = array[j];
array[j] = temp;
i++;
j--;
}
return array;
}
nextperm (a, n)
1. find an index j such that a[j….n - 1] forms a monotonically decreasing sequence.
2. If j == 0 next perm not possible
3. Else
1. Reverse the array a[j…n - 1]
2. Binary search for index of a[j - 1] in a[j….n - 1]
3. Let i be the returned index
4. Increment i until a[j - 1] < a[i]
5. Swap a[j - 1] and a[i]
O(n) for each permutation.
- 1. Algoritmo para encontrar la permutación numérica dado el índice lexicográfico
- 2. Pregunta de entrevista: ¿Encontrar caracteres Siguiente y Anterior en una cadena dada?
- 3. Algoritmo para encontrar lenth de secuencia más larga de espacios en blanco en una cadena dada
- 4. Algoritmo para encontrar el siguiente número en una secuencia
- 5. Encuentra el índice de una permutación dada en la lista ordenada de las permutaciones de una cadena dada
- 6. ¿Qué es un algoritmo típico para encontrar una cadena dentro de una cadena?
- 7. Algoritmo para encontrar 2 elementos con la diferencia dada en una matriz
- 8. Para encontrar toda la subcadena que se repite en una cadena dada
- 9. reglas de coincidencia dada una entrada (algoritmo)
- 10. Oráculo - permutación combinatoria de cadena
- 11. Algoritmo para encontrar una forma cuadrada en una imagen?
- 12. Encontrar el número de inversiones de permutación
- 13. Algoritmo para encontrar rectángulos
- 14. ¿Cómo encontrar si un archivo contiene una cadena dada usando la línea de comandos de Windows
- 15. Permutación rápida -> número -> algoritmos de asignación de permutación
- 16. Algoritmo para encontrar grupos óptimos
- 17. Encontrar un algoritmo eficiente para una operación de matriz
- 18. Algoritmo para encontrar simetrías de un árbol
- 19. Usando JQuery para encontrar la siguiente fila de la tabla
- 20. ¿Cuál es la forma de búsqueda scala idiomática, si una cadena dada contiene una subcadena dada?
- 21. algoritmo para encontrar la mejor combinación
- 22. Dada una superficie normal, encontrar rotación para Plane 3D
- 23. ¿Algoritmo más rápido para encontrar una cadena en una matriz de cadenas?
- 24. Algoritmo para encontrar puntos cercanos?
- 25. Dada una cadena, se encuentran todas sus permutaciones que son una palabra en el diccionario de
- 26. ¿Cómo generar una permutación?
- 27. C++ Encontrar el mayor número en serie
- 28. Algoritmo para encontrar subconjuntos comunes
- 29. Algoritmo para encontrar agregados elementos/retirados de una matriz
- 30. Generar una permutación aleatoria uniforme
http://stackoverflow.com/questions/352203/generating- permutations-lazily –
¿Qué significa 'la próxima permutación mayor '? Vengo de Leetcode, quiero buscar el significado de esto. –