Lexicographically n-th permutation of a string
Last Updated :
03 May, 2023
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++
// 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
// 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
# 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#
// 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 */
JavaScript
// 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
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
Similar Reads
Find n-th lexicographically permutation of a string | Set 2 Given a string of length m containing lowercase alphabets only. We need to find the n-th permutation of string lexicographic ally. Examples: Input: str[] = "abc", n = 3 Output: Result = "bac" All possible permutation in sorted order: abc, acb, bac, bca, cab, cba Input: str[] = "aba", n = 2 Output: R
11 min read
Lexicographically Next Permutation of given String All the permutations of a word when arranged in a dictionary, the order of words so obtained is called lexicographical order. in Simple words, it is the one that has all its elements sorted in ascending order, and the largest has all its elements sorted in descending order. lexicographically is noth
8 min read
Lexicographic rank of a String Given a string str, find its rank among all its permutations when sorted lexicographically.Note: The characters in string are all unique.Examples:Input: str = "acb"Output: 2Explanation: If all the permutations of the string are arranged lexicographically they will be "abc", "acb", "bac", "bca", "cab
15+ min read
How to find Lexicographically previous permutation? Given a word, find a lexicographically smaller permutation of it. For example, lexicographically smaller permutation of â4321â is â4312â and the next smaller permutation of â4312â is â4231â. If the string is sorted in ascending order, the next lexicographically smaller permutation doesnât exist. Rec
11 min read
Lexicographically smallest permutation of a string with given subsequences Given a string consisting only of two lowercase characters x and y and two numbers p and q . The task is to print the lexicographically smallest permutation of the given string such that the count of subsequences of xy is p and of yx is q . If no such string exists, print "Impossible" (without quote
9 min read