Given a string of length m containing lowercase alphabets only. You have to find the n-th permutation of string lexicographically.
Examples:
Input : str[] = "abc", n = 3 Output : Result = "bac" Explanation : All possible permutation in sorted order: abc, acb, bac, bca, cab, cba Input : str[] = "aba", n = 2 Output : Result = "aba" Explanation : All possible permutation in sorted order: aab, aba, baa
Prerequisite : Permutations of a given string using STL Idea behind printing n-th permutation is quite simple we should use STL (explained in above link) for finding next permutation and do it till the nth permutation. After n-th iteration, we should break from the loop and then print the string which is our nth permutation.
long int i = 1; do { // check for nth iteration if (i == n) break; i++; // keep incrementing the iteration } while (next_permutation(str.begin(), str.end())); // print string after nth iteration print str;
Implementation:
// C++ program to print nth permutation with // using next_permute() #include <bits/stdc++.h> using namespace std;
// Function to print nth permutation // using next_permute() void nPermute(string str, long int n)
{ // Sort the string in lexicographically
// ascending order
sort(str.begin(), str.end());
// Keep iterating until
// we reach nth position
long int i = 1;
do {
// check for nth iteration
if (i == n)
break ;
i++;
} while (next_permutation(str.begin(), str.end()));
// print string after nth iteration
cout << str;
} // Driver code int main()
{ string str = "GEEKSFORGEEKS" ;
long int n = 100;
nPermute(str, n);
return 0;
} |
// Java program to print nth permutation with // using next_permute() import java.util.*;
class GFG
{ // Function to print nth permutation // using next_permute() static void nPermute( char [] str, int n)
{ // Sort the string in lexicographically
// ascending order
Arrays.sort(str);
// Keep iterating until
// we reach nth position
int i = 1 ;
do {
// check for nth iteration
if (i == n)
break ;
i++;
} while (next_permutation(str));
// print string after nth iteration
System.out.println(String.valueOf(str));
} static boolean next_permutation( char [] p)
{ for ( int a = p.length - 2 ; a >= 0 ; --a)
if (p[a] < p[a + 1 ])
for ( int b = p.length - 1 ;; --b)
if (p[b] > p[a])
{
char t = p[a];
p[a] = p[b];
p[b] = t;
for (++a, b = p.length - 1 ; a < b; ++a, --b)
{
t = p[a];
p[a] = p[b];
p[b] = t;
}
return true ;
}
return false ;
} // Driver code public static void main(String[] args)
{ String str = "GEEKSFORGEEKS" ;
int n = 100 ;
nPermute(str.toCharArray(), n);
} } // This code contributed by Rajput-Ji |
# Python3 program to print nth permutation # with using next_permute() # next_permutation method implementation def next_permutation(L):
n = len (L)
i = n - 2
while i > = 0 and L[i] > = L[i + 1 ]:
i - = 1
if i = = - 1 :
return False
j = i + 1
while j < n and L[j] > L[i]:
j + = 1
j - = 1
L[i], L[j] = L[j], L[i]
left = i + 1
right = n - 1
while left < right:
L[left], L[right] = L[right], L[left]
left + = 1
right - = 1
return True
# Function to print nth permutation # using next_permute() def nPermute(string, n):
string = list (string)
new_string = []
# Sort the string in lexicographically
# ascending order
string.sort()
j = 2
# Keep iterating until
# we reach nth position
while next_permutation(string):
new_string = string
# check for nth iteration
if j = = n:
break
j + = 1
# print string after nth iteration
print (''.join(new_string))
# Driver Code if __name__ = = "__main__" :
string = "GEEKSFORGEEKS"
n = 100
nPermute(string, n)
# This code is contributed by # sanjeev2552 |
// C# program to print nth permutation with // using next_permute() using System;
class GFG
{ // Function to print nth permutation // using next_permute() static void nPermute( char [] str, int n)
{ // Sort the string in lexicographically
// ascending order
Array.Sort(str);
// Keep iterating until
// we reach nth position
int i = 1;
do
{
// check for nth iteration
if (i == n)
break ;
i++;
} while (next_permutation(str));
// print string after nth iteration
Console.WriteLine(String.Join( "" ,str));
} static bool next_permutation( char [] p)
{ for ( int a = p.Length - 2; a >= 0; --a)
if (p[a] < p[a + 1])
for ( int b = p.Length - 1;; --b)
if (p[b] > p[a])
{
char t = p[a];
p[a] = p[b];
p[b] = t;
for (++a, b = p.Length - 1; a < b; ++a, --b)
{
t = p[a];
p[a] = p[b];
p[b] = t;
}
return true ;
}
return false ;
} // Driver code public static void Main()
{ String str = "GEEKSFORGEEKS" ;
int n = 100;
nPermute(str.ToCharArray(), n);
} } /* This code contributed by PrinciRaj1992 */ |
// next_permutation method implementation function nextPermutation(L) {
let n = L.length;
let i = n - 2;
while (i >= 0 && L[i] >= L[i + 1]) {
i--;
}
if (i === -1) {
return false ;
}
let j = i + 1;
while (j < n && L[j] > L[i]) {
j++;
}
j--;
[L[i], L[j]] = [L[j], L[i]];
let left = i + 1;
let right = n - 1;
while (left < right) {
[L[left], L[right]] = [L[right], L[left]];
left++;
right--;
}
return true ;
} // Function to print nth permutation // using next_permute() function nPermute(string, n) {
let newString = [];
// Sort the string in lexicographically
// ascending order
string = string.split( "" ).sort().join( "" );
let j = 2;
// Keep iterating until
// we reach nth position
while (nextPermutation(string.split( "" ))) {
newString = string.split( "" );
// check for nth iteration
if (j === n) {
break ;
}
j++;
}
// print string after nth iteration
console.log(newString.join( "" ));
} // Driver Code let string = "GEEKSFORGEEKS" ;
let n = 100; nPermute(string, n); // This code is contributed by Shivam Tiwari |
EEEEFGGRKSOSK
Time Complexity: O(n + |S| log |S|) Sorting S is log-linear time. `next_permutation` has constant time amortized complexity, however n is independent of |S|, so it is still necessary to include it in the final time complexity notation to properly reflect growth of running time.
Auxiliary Space: O(1) since no extra array is used space occupied by the algorithm is constant
Find n-th lexicographically permutation of a string | Set 2