1

For input string "bba", it's not generating all the integer permutations. The integers that will be stored in the array are: 2, 1, 1

The output is 2 1 1.

I want the output to be:

1 1 2

1 2 1

2 1 1

#include <bits/stdc++.h>

int main() {
    std::string s;
    std::cout << "Enter a string: ";
    std::cin >> s;
    int ss = s.size();
    int ar[ss];
    for(int i=0; i<ss; i++) {
        int tmp = int(s[i])-96;
        ar[i] = tmp;
    }  

    do {
        for(auto i: ar) std::cout << i;
        std::cout << '\n';
    } while(std::next_permutation(ar, ar+ss));

    return 0;
}
Mohit Negi
  • 42
  • 2
  • 9

2 Answers2

4

The reason you are getting only one permutation is because there's no permutation lexicographically greater that the current state of array: [2, 2, 1]. See the documentation of std::permutation:

Transforms the range [first, last) into the next permutation from the set of all permutations that are lexicographically ordered with respect to operator< or comp. Returns true if such permutation exists, otherwise transforms the range into the first permutation (as if by std::sort(first, last)) and returns false.

Consider using std::vector instead of C-array and sorting it before calculating all the permutations:

#include <string>
#include <iostream>
#include <vector>
#include <algorithm>

int main() {
    std::string s = "bba";
    const int ss = s.size();
    std::vector<int> ar;
    ar.reserve(ss);
    constexpr int offset = 'a' - 1;
    for(int i=0; i<ss; i++) {
        int tmp = int(s[i]) - offset;
        ar.push_back(tmp);
    }  
    std::sort(ar.begin(), ar.end());
    do {
        for(auto i: ar) std::cout << i;
        std::cout << '\n';
    } while(std::next_permutation(ar.begin(), ar.end()));

    return 0;
}

This outputs:

122
212
221

Live example

Update: as it was pointed out by @Someprogrammerdude, please see: Why should I not #include <bits/stdc++.h>

Update 2: as it was pointed out by @Jarod42 consider using 'a' - 1 instead of magic-constant 96.

AMA
  • 4,114
  • 18
  • 32
2

Making an array of Integers before generating permutations seems unnecessary. You are missing a point where you sort your values.

Try this approach instead:

std::sort(s.begin(), s.end());
do {
    for(int i = 0; i < s.size(); i++){
        std::cout << int(s[i]) - 96 << " ";
    }
    std::cout << '\n';
} while(std::next_permutation(s.begin(), s.end()));

The output is

1 2 2                                                                                                                                                                                       
2 1 2                                                                                                                                                                                       
2 2 1 
Hades
  • 119
  • 8