Algorithme pour trouver la permutation suivante d'une chaîne donnée

Je veux un algorithme efficace pour trouver la permutation suivante de la chaîne donnée.

47
demandé sur Ðаn 2009-10-26 02:54:23

7 réponses

Wikipedia a un bel article sur la génération d'ordre lexicographique. Il décrit également un algorithme pour générer la permutation suivante.

Citant:

L'algorithme suivant génère lexicographiquement la permutation suivante après une permutation donnée. Il modifie la permutation donnée sur place.

  1. Trouver l'indice le plus élevé i tels que s[i] < s[i+1]. Si un tel indice existe, la permutation est la dernière permutation.
  2. trouver le plus élevé index j > i tel que s[j] > s[i]. Un tel j doit exister, puisque i+1 est un tel indice.
  3. échange s[i] avec s[j].
  4. Inverser l'ordre de tous les éléments après index i jusqu'au dernier élément.
121
répondu Alexandru 2016-01-15 09:04:05

Une excellente solution qui fonctionne est décrite ici: https://www.nayuki.io/page/next-lexicographical-permutation-algorithm . et la solution qui, si la permutation suivante existe, la renvoie, sinon retourne 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;
}
10
répondu rm- 2016-02-17 17:27:06

Devoirs? Quoi qu'il en soit, peut regarder la fonction c++ std:: next_permutation, ou ceci:

Http://blog.bjrn.se/2008/04/lexicographic-permutations-using.html

4
répondu Brian 2009-10-25 23:57:23

Nous pouvons trouver la chaîne lexicographique suivante la plus grande pour une chaîne donnée en utilisant l'étape suivante.

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 chaîne donnée est la chaîne lexicographique suivante de S. On peut également utiliser next_permutation Appel de fonction en C++.

1
répondu gaurav 2015-05-30 06:47:13

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.
0
répondu user3809584 2017-10-11 05:25:14
void Solution::nextPermutation(vector<int> &a) {    
int i,j=-1,k,t=a.size();
for(i=0;i<t-1;i++)
{
    if(a[i]<a[i+1])
    j=i;
}
if(j==-1)
reverse(a.begin(),a.end());
else
{
for(i=j+1;i<t;i++)
    {
        if(a[j]<a[i])
        k=i;
    }
swap(a[j],a[k]);
reverse(a.begin()+j+1,a.end());
}

}

0
répondu Shubham Aggarwal 2018-06-05 20:14:19

J'espère que ce code pourrait être utile.

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";
    }
}
-6
répondu sac 2015-05-30 06:45:31