Skip to content
geeksforgeeks
  • Courses
    • DSA to Development
    • Get IBM Certification
    • Newly Launched!
      • Master Django Framework
      • Become AWS Certified
    • For Working Professionals
      • Interview 101: DSA & System Design
      • Data Science Training Program
      • JAVA Backend Development (Live)
      • DevOps Engineering (LIVE)
      • Data Structures & Algorithms in Python
    • For Students
      • Placement Preparation Course
      • Data Science (Live)
      • Data Structure & Algorithm-Self Paced (C++/JAVA)
      • Master Competitive Programming (Live)
      • Full Stack Development with React & Node JS (Live)
    • Full Stack Development
    • Data Science Program
    • All Courses
  • Tutorials
    • Data Structures & Algorithms
    • ML & Data Science
    • Interview Corner
    • Programming Languages
    • Web Development
    • CS Subjects
    • DevOps And Linux
    • School Learning
  • Practice
    • Build your AI Agent
    • GfG 160
    • Problem of the Day
    • Practice Coding Problems
    • GfG SDE Sheet
  • Contests
    • Accenture Hackathon (Ending Soon!)
    • GfG Weekly [Rated Contest]
    • Job-A-Thon Hiring Challenge
    • All Contests and Events
  • DSA
  • Practice Combinatorics
  • MCQs on Combinatorics
  • Basics of Combinatorics
  • Permutation and Combination
  • Permutation Vs Combination
  • Binomial Coefficient
  • Calculate nPr
  • Calculate nCr
  • Pigeonhole Principle
  • Principle of Inclusion-Exclusion
  • Catalan Number
  • Lexicographic Rank
  • Next permutation
  • Previous Permutation
Open In App
Next Article:
Lexicographically smallest permutation of a string with given subsequences
Next article icon

Find n-th lexicographically permutation of a string | Set 2

Last Updated : 24 Mar, 2023
Comments
Improve
Suggest changes
Like Article
Like
Report
Try it on GfG Practice
redirect icon

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: Result = "aba" All possible permutation  in sorted order: aab, aba, baa
Recommended PracticeString PermutationsTry It!

Naive Approach: Find lexicographically n-th permutation using STL.
Efficient Approach: Mathematical concept for solving this problem. 

  1. The total number of permutation of a string formed by N characters(all distinct) is N!
  2. The Total number of permutation of a string formed by N characters (where the frequency of character C1 is M1, C2 is M2… and so the frequency of character Ck is Mk) is N!/(M1! * M2! *….Mk!).
  3. The total number of permutation of a string formed by N characters(all distinct) after fixing the first character is (N-1)!

The following steps can be followed to reach the solution. 

  • Count the frequencies of all characters in an array.
  • Now from the first smallest character present in the string(smallest index i such that freq[i] > 0), compute the number of maximum permutation possible after setting that particular i-th character as the first character.
  • If this sum value is more than given n, then set that character as the first result output character, and decrement freq[i]. Continue the same for the remaining n-1 characters.
  • On the other hand, if the count is less than the required n, then iterate for the next character in the frequency table and update the count over and over again until we find a character that produces a count greater than the required n. 

Implementation:

C++




// C++ program to print
// n-th permutation
#include <bits/stdc++.h>
using namespace std;
 
#define ll long long int
 
const int MAX_CHAR = 26;
const int MAX_FACT = 20;
ll fact[MAX_FACT];
 
// Utility for calculating factorials
void precomputeFactorials()
{
    fact[0] = 1;
    for (int i = 1; i < MAX_FACT; i++)
        fact[i] = fact[i - 1] * i;
}
 
// Function for nth permutation
void nPermute(char str[], int n)
{
    precomputeFactorials();
 
    // Length of given string
    int len = strlen(str);
 
    // Count frequencies of all
    // characters
    int freq[MAX_CHAR] = { 0 };
    for (int i = 0; i < len; i++)
        freq[str[i] - 'a']++;
 
    // Out string for output string
    char out[MAX_CHAR];
 
    // Iterate till sum equals n
    int sum = 0;
    int k = 0;
 
    // We update both n and sum in this
    // loop.
    while (sum != n) {
 
        sum = 0;
        // Check for characters present in freq[]
        for (int i = 0; i < MAX_CHAR; i++) {
            if (freq[i] == 0)
                continue;
 
            // Remove character
            freq[i]--;
 
            // Calculate sum after fixing
            // a particular char
            int xsum = fact[len - 1 - k];
            for (int j = 0; j < MAX_CHAR; j++)
                xsum /= fact[freq[j]];
            sum += xsum;
 
            // if sum > n fix that char as
            // present char and update sum
            // and required nth after fixing
            // char at that position
            if (sum >= n) {
                out[k++] = i + 'a';
                n -= (sum - xsum);
                break;
            }
 
            // if sum < n, add character back
            if (sum < n)
                freq[i]++;
        }
    }
 
    // if sum == n means this
    // char will provide its
    // greatest permutation
    // as nth permutation
    for (int i = MAX_CHAR - 1;
         k < len && i >= 0; i--)
        if (freq[i]) {
            out[k++] = i + 'a';
            freq[i++]--;
        }
 
    // append string termination
    // character and print result
    out[k] = '\0';
    cout << out;
}
 
// Driver program
int main()
{
    int n = 2;
    char str[] = "geeksquiz";
 
    nPermute(str, n);
    return 0;
}
 
 

Java




// Java program to print
// n-th permutation
public class PermuteString {
    final static int MAX_CHAR = 26;
    final static int MAX_FACT = 20;
    static long fact[] = new long[MAX_FACT];
 
    // Utility for calculating factorial
    static void precomputeFactorirals()
    {
        fact[0] = 1;
        for (int i = 1; i < MAX_FACT; i++)
            fact[i] = fact[i - 1] * i;
    }
 
    // Function for nth permutation
    static void nPermute(String str, int n)
    {
        precomputeFactorirals();
 
        // length of given string
        int len = str.length();
 
        // Count frequencies of all
        // characters
        int freq[] = new int[MAX_CHAR];
        for (int i = 0; i < len; i++)
            freq[str.charAt(i) - 'a']++;
 
        // out string for output string
        String out = "";
 
        // Iterate till sum equals n
        int sum = 10;
        int k = 0;
 
        // We update both n and sum
        // in this loop.
        while (sum >= n) {
 
            // Check for characters
            // present in freq[]
            for (int i = 0; i < MAX_CHAR; i++) {
                if (freq[i] == 0)
                    continue;
 
                // Remove character
                freq[i]--;
 
                // calculate sum after fixing
                // a particular char
                sum = 0;
                int xsum = (int)fact[len - 1 - k];
                for (int j = 0; j < MAX_CHAR; j++)
                    xsum /= fact[freq[j]];
                sum += xsum;
 
                // if sum > n fix that char as
                // present char and update sum
                // and required nth after fixing
                // char at that position
                if (sum >= n) {
                    out += (char)(i + 'a');
                    k++;
                    n -= (sum - xsum);
                    break;
                }
 
                // if sum < n, add character back
                if (sum < n)
                    freq[i]++;
            }
        }
 
        // if sum == n means this
        // char will provide its
        // greatest permutation
        // as nth permutation
        for (int i = MAX_CHAR - 1;
             k < len && i >= 0; i--)
            if (freq[i] != 0) {
                out += (char)(i + 'a');
                freq[i++]--;
            }
 
        // append string termination
        // character and print result
        System.out.println(out);
    }
 
    // Driver program to test above method
    public static void main(String[] args)
    {
 
        // TODO Auto-generated method stub
        int n = 2;
        String str = "geeksquiz";
 
        nPermute(str, n);
    }
}
// This code is contributed by Sumit Ghosh
 
 

Python3




# Python3 program to print n-th permutation
 
MAX_CHAR = 26
MAX_FACT = 20
fact = [None] * (MAX_FACT)
 
# Utility for calculating factorials
def precomputeFactorials():
 
    fact[0] = 1
    for i in range(1, MAX_FACT):
        fact[i] = fact[i - 1] * i
 
# Function for nth permutation
def nPermute(string, n):
 
    precomputeFactorials()
 
    # length of given string
    length = len(string)
 
    # Count frequencies of all
    # characters
    freq = [0] * (MAX_CHAR)
    for i in range(0, length):
        freq[ord(string[i]) - ord('a')] += 1
 
    # out string for output string
    out = [None] * (MAX_CHAR)
 
    # iterate till sum equals n
    Sum, k = 0, 0
 
    # We update both n and sum in
    # this loop.
    while Sum != n:
 
        Sum = 0
         
        # check for characters present in freq[]
        for i in range(0, MAX_CHAR):
            if freq[i] == 0:
                continue
 
            # Remove character
            freq[i] -= 1
 
            # calculate sum after fixing
            # a particular char
            xsum = fact[length - 1 - k]
            for j in range(0, MAX_CHAR):
                xsum = xsum // fact[freq[j]]
            Sum += xsum
 
            # if sum > n fix that char as
            # present char and update sum
            # and required nth after fixing
            # char at that position
            if Sum >= n:
                out[k] = chr(i + ord('a'))
                n -= Sum - xsum
                k += 1
                break
             
            # if sum < n, add character back
            if Sum < n:
                freq[i] += 1
         
    # if sum == n means this char will provide
    # its greatest permutation as nth permutation
    i = MAX_CHAR-1
    while k < length and i >= 0:
        if freq[i]:
            out[k] = chr(i + ord('a'))
            freq[i] -= 1
            i += 1
            k += 1
         
        i -= 1
 
    # print result
    print(''.join(out[:k]))
 
# Driver Code
if __name__ == "__main__":
 
    n = 2
    string = "geeksquiz"
 
    nPermute(string, n)
     
# This code is contributed by Rituraj Jain
 
 

C#




// C# program to print n-th permutation
using System;
 
public class GFG {
 
    static int MAX_CHAR = 26;
    static int MAX_FACT = 20;
    static long[] fact = new long[MAX_FACT];
 
    // utility for calculating factorial
    static void precomputeFactorirals()
    {
        fact[0] = 1;
        for (int i = 1; i < MAX_FACT; i++)
            fact[i] = fact[i - 1] * i;
    }
 
    // function for nth permutation
    static void nPermute(String str, int n)
    {
        precomputeFactorirals();
 
        // length of given string
        int len = str.Length;
 
        // Count frequencies of all
        // characters
        int[] freq = new int[MAX_CHAR];
 
        for (int i = 0; i < len; i++)
            freq[str[i] - 'a']++;
 
        // out string for output string
        string ou = "";
 
        // iterate till sum equals n
        int sum = 10;
        int k = 0;
 
        // We update both n and sum in this
        // loop.
        while (sum >= n) {
 
            // check for characters present in freq[]
            for (int i = 0; i < MAX_CHAR; i++) {
                if (freq[i] == 0)
                    continue;
 
                // Remove character
                freq[i]--;
 
                // calculate sum after fixing
                // a particular char
                sum = 0;
                int xsum = (int)fact[len - 1 - k];
 
                for (int j = 0; j < MAX_CHAR; j++)
                    xsum /= (int)(fact[freq[j]]);
 
                sum += xsum;
 
                // if sum > n fix that char as
                // present char and update sum
                // and required nth after fixing
                // char at that position
                if (sum >= n) {
                    ou += (char)(i + 'a');
                    k++;
                    n -= (sum - xsum);
                    break;
                }
 
                // if sum < n, add character back
                if (sum < n)
                    freq[i]++;
            }
        }
 
        // if sum == n means this char will provide its
        // greatest permutation as nth permutation
        for (int i = MAX_CHAR - 1; k < len && i >= 0; i--)
            if (freq[i] != 0) {
                ou += (char)(i + 'a');
                freq[i++]--;
            }
 
        // append string termination
        // character and print result
        Console.Write(ou);
    }
 
    // Driver program to test above method
    public static void Main()
    {
 
        // TODO Auto-generated method stub
        int n = 2;
        String str = "geeksquiz";
 
        nPermute(str, n);
    }
}
 
// This code is contributed by nitin mittal.
 
 

Javascript




<script>
// Javascript program to print
// n-th permutation
 
let MAX_CHAR = 26;
let MAX_FACT = 20;
 
let fact=new Array(MAX_FACT);
 
 // Utility for calculating factorial
function precomputeFactorirals()
{
    fact[0] = 1;
        for (let i = 1; i < MAX_FACT; i++)
            fact[i] = fact[i - 1] * i;
}
 
// Function for nth permutation
function nPermute(str,n)
{
    precomputeFactorirals();
   
        // length of given string
        let len = str.length;
   
        // Count frequencies of all
        // characters
        let freq = new Array(MAX_CHAR);
        for(let i=0;i<MAX_CHAR;i++)
        {
            freq[i]=0;
        }
        for (let i = 0; i < len; i++)
            freq[str[i].charCodeAt(0) - 'a'.charCodeAt(0)]++;
   
        // out string for output string
        let out = "";
   
        // Iterate till sum equals n
        let sum = 10;
        let k = 0;
   
        // We update both n and sum
        // in this loop.
        while (sum >= n) {
   
            // Check for characters
            // present in freq[]
            for (let i = 0; i < MAX_CHAR; i++) {
                if (freq[i] == 0)
                    continue;
   
                // Remove character
                freq[i]--;
   
                // calculate sum after fixing
                // a particular char
                sum = 0;
                let xsum = fact[len - 1 - k];
                for (let j = 0; j < MAX_CHAR; j++)
                    xsum = Math.floor(xsum/fact[freq[j]]);
                sum += xsum;
   
                // if sum > n fix that char as
                // present char and update sum
                // and required nth after fixing
                // char at that position
                if (sum >= n) {
                    out += String.fromCharCode(i + 'a'.charCodeAt(0));
                    k++;
                    n -= (sum - xsum);
                    break;
                }
   
                // if sum < n, add character back
                if (sum < n)
                    freq[i]++;
            }
        }
   
        // if sum == n means this
        // char will provide its
        // greatest permutation
        // as nth permutation
        for (let i = MAX_CHAR - 1;
             k < len && i >= 0; i--)
            if (freq[i] != 0) {
                out += String.fromCharCode(i + 'a'.charCodeAt(0));
                freq[i++]--;
            }
   
        // append string termination
        // character and print result
        document.write(out);
}
 
// Driver program to test above method
// TODO Auto-generated method stub
let n = 2;
let str = "geeksquiz";
 
nPermute(str, n);
 
// This code is contributed by avanitrachhadiya2155
</script>
 
 
Output
eegikqszu

Complexity Analysis:  

  • Time Complexity: O(N^2), where N is the length of the input string.
  • Auxiliary Space: O(MAX_CHAR), which is the size of the freq and out arrays


Next Article
Lexicographically smallest permutation of a string with given subsequences
https://media.geeksforgeeks.org/auth/avatar.png
GeeksforGeeks
Improve
Article Tags :
  • Combinatorial
  • DSA
  • Recursion
  • Strings
  • Accolite
  • Amazon
  • Cisco
  • MAQ Software
  • Samsung
Practice Tags :
  • Accolite
  • Amazon
  • Cisco
  • MAQ Software
  • Samsung
  • Combinatorial
  • Recursion
  • Strings

Similar Reads

  • Lexicographically n-th permutation of a string
    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"
    6 min read
  • Lexicographically smallest permutation of a string with given subsequences
    Given a string consisting only of two lowercase characters [Tex]x [/Tex]and [Tex]y [/Tex]and two numbers [Tex]p [/Tex]and [Tex]q [/Tex]. The task is to print the lexicographically smallest permutation of the given string such that the count of subsequences of [Tex]xy [/Tex]is [Tex]p [/Tex]and of [Te
    9 min read
  • Print all lexicographical greater permutations of a given string
    Given a string S, print those permutations of string S which are lexicographically greater than S. If there is no such permutation of string, print -1. Examples: Input : BCA Output : CAB, CBA Explanation: Here, S = "BCA", and there are 2 strings "CAB, CBA" which are lexicographically greater than S.
    13 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
  • Print all permutations in sorted (lexicographic) order
    Given a string s, print all unique permutations of the string in lexicographically sorted order. Examples: Input: "ABC"Output: ["ABC", "ACB", "BAC", "BCA", "CAB", "CBA"]Explanation: All characters are distinct, so there are 3! = 6 unique permutations, printed in sorted order. Input: "AAA"Output: ["A
    15+ min read
  • Find the N-th lexicographic permutation of string using Factoradic method
    Given string str with unique characters and a number N, the task is to find the N-th lexicographic permutation of the string using Factoradic method. Examples: Input: str = "abc", N = 3 Output: bac Explanation: All possible permutations in sorted order: abc, acb, bac, bca, cab, cba 3rd permutation i
    7 min read
  • Find Lexicographically smallest String with Prefix Reversal
    Given a string str of length N. You have to choose a non-zero integer K (K <= N), such that in one operation you can take the prefix of the string of length K and append the reverse of it to itself, the task is to find the lexicographically smallest string you can get. Examples: Input: str = "bvd
    5 min read
  • Find Lexicographically smallest String
    Given a circular string s, find whether there exists a permutation of s which is a K-periodic circular string and if it exists then find the lexicographically smallest permutation of s which is a K-periodic circular string. Return an empty string if there does not exist a valid permutation of s whic
    6 min read
  • Distinct permutations of the string | Set 2
    Given a string s, the task is to return all unique permutations of a given string in lexicographically sorted order. Note: A permutation is the rearrangement of all the elements of a string. Examples: Input: s = "ABC"Output: "ABC", "ACB", "BAC", "BCA", "CBA", "CAB" Input: s = "XY"Output: "XY", "YX"
    6 min read
  • Find lexicographically smallest string in at most one swaps
    Given a string str of length N. The task is to find out the lexicographically smallest string when at most only one swap is allowed. That is, two indices 1 <= i, j <= n can be chosen and swapped. This operation can be performed at most one time. Examples: Input: str = "string" Output: gtrins E
    14 min read
geeksforgeeks-footer-logo
Corporate & Communications Address:
A-143, 7th Floor, Sovereign Corporate Tower, Sector- 136, Noida, Uttar Pradesh (201305)
Registered Address:
K 061, Tower K, Gulshan Vivante Apartment, Sector 137, Noida, Gautam Buddh Nagar, Uttar Pradesh, 201305
GFG App on Play Store GFG App on App Store
Advertise with us
  • Company
  • About Us
  • Legal
  • Privacy Policy
  • In Media
  • Contact Us
  • Advertise with us
  • GFG Corporate Solution
  • Placement Training Program
  • Languages
  • Python
  • Java
  • C++
  • PHP
  • GoLang
  • SQL
  • R Language
  • Android Tutorial
  • Tutorials Archive
  • DSA
  • Data Structures
  • Algorithms
  • DSA for Beginners
  • Basic DSA Problems
  • DSA Roadmap
  • Top 100 DSA Interview Problems
  • DSA Roadmap by Sandeep Jain
  • All Cheat Sheets
  • Data Science & ML
  • Data Science With Python
  • Data Science For Beginner
  • Machine Learning
  • ML Maths
  • Data Visualisation
  • Pandas
  • NumPy
  • NLP
  • Deep Learning
  • Web Technologies
  • HTML
  • CSS
  • JavaScript
  • TypeScript
  • ReactJS
  • NextJS
  • Bootstrap
  • Web Design
  • Python Tutorial
  • Python Programming Examples
  • Python Projects
  • Python Tkinter
  • Python Web Scraping
  • OpenCV Tutorial
  • Python Interview Question
  • Django
  • Computer Science
  • Operating Systems
  • Computer Network
  • Database Management System
  • Software Engineering
  • Digital Logic Design
  • Engineering Maths
  • Software Development
  • Software Testing
  • DevOps
  • Git
  • Linux
  • AWS
  • Docker
  • Kubernetes
  • Azure
  • GCP
  • DevOps Roadmap
  • System Design
  • High Level Design
  • Low Level Design
  • UML Diagrams
  • Interview Guide
  • Design Patterns
  • OOAD
  • System Design Bootcamp
  • Interview Questions
  • Inteview Preparation
  • Competitive Programming
  • Top DS or Algo for CP
  • Company-Wise Recruitment Process
  • Company-Wise Preparation
  • Aptitude Preparation
  • Puzzles
  • School Subjects
  • Mathematics
  • Physics
  • Chemistry
  • Biology
  • Social Science
  • English Grammar
  • Commerce
  • World GK
  • GeeksforGeeks Videos
  • DSA
  • Python
  • Java
  • C++
  • Web Development
  • Data Science
  • CS Subjects
@GeeksforGeeks, Sanchhaya Education Private Limited, All rights reserved
We use cookies to ensure you have the best browsing experience on our website. By using our site, you acknowledge that you have read and understood our Cookie Policy & Privacy Policy
Lightbox
Improvement
Suggest Changes
Help us improve. Share your suggestions to enhance the article. Contribute your expertise and make a difference in the GeeksforGeeks portal.
geeksforgeeks-suggest-icon
Create Improvement
Enhance the article with your expertise. Contribute to the GeeksforGeeks community and help create better learning resources for all.
geeksforgeeks-improvement-icon
Suggest Changes
min 4 words, max Words Limit:1000

Thank You!

Your suggestions are valuable to us.

What kind of Experience do you want to share?

Interview Experiences
Admission Experiences
Career Journeys
Work Experiences
Campus Experiences
Competitive Exam Experiences