Generate lexicographically smallest string of 0, 1 and 2 with adjacent swaps allowed

Given a string str containing only characters 0, 1 and 2, you can swap any two adjacent (consecutive) characters 0 and 1 or any two adjacent (consecutive) characters 1 and 2. The task is to obtain the minimum possible (lexicographically) string by using these swaps arbitrary number of times.

Examples:

Input: str = “100210”
Output: 001120
We can swap 0 and 1 OR we can swap 1 and 2. Swapping 0 and 2 is not allowed. All the swaps can happen for adjacent only.

Input: str = “2021”
Output: 1202
Note that 0 and 2 cannot be swapped

Recommended: Please try your approach on {IDE} first, before moving on to the solution.

Approach: You can print all the 1s together as 1 can be swapped with either of the other characters while 0 and 2 can not be swapped, so all the 0s and 2s will follow the same order as the original string.

Below is the implementation of the above approach:

C++

 // C++ implementation of the approach #include using namespace std;    // Function to print the required string void printString(string str, int n) {     // count number of 1s     int ones = 0;     for (int i = 0; i < n; i++)         if (str[i] == '1')             ones++;        // To check if the all the 1s     // have been used or not     bool used = false;        for (int i = 0; i < n; i++) {         if (str[i] == '2' && !used) {             used = 1;                // Print all the 1s if any 2 is encountered             for (int j = 0; j < ones; j++)                 cout << "1";         }            // If str[i] = 0 or str[i] = 2         if (str[i] != '1')             cout << str[i];     }        // If 1s are not printed yet     if (!used)         for (int j = 0; j < ones; j++)             cout << "1"; }    // Driver code int main() {     string str = "100210";     int n = str.length();     printString(str, n);     return 0; }

Java

 // Java implementation of the approach    class GFG  {    // Function to print the required string static void printString(char[] str, int n) {     // count number of 1s     int ones = 0;     for (int i = 0; i < n; i++)         if (str[i] == '1')             ones++;        // To check if the all the 1s     // have been used or not     boolean used = false;        for (int i = 0; i < n; i++)      {         if (str[i] == '2' && !used)          {             used = true;                // Print all the 1s if any 2 is encountered             for (int j = 0; j < ones; j++)                 System.out.print("1");         }            // If str[i] = 0 or str[i] = 2         if (str[i] != '1')             System.out.print(str[i]);        }        // If 1s are not printed yet     if (!used)         for (int j = 0; j < ones; j++)             System.out.print("1"); }    // Driver code public static void main(String[] args)  {     String str = "100210";     int n = str.length();     printString(str.toCharArray(), n); } }    /* This code contributed by PrinciRaj1992 */

Python3

 # Python3 implementation of the approach    # Function to prthe required string def printString(Str1, n):        # count number of 1s     ones = 0     for i in range(n):         if (Str1[i] == '1'):             ones += 1        # To check if the all the 1s     # have been used or not     used = False        for i in range(n):         if (Str1[i] == '2' and used == False):             used = 1                # Prall the 1s if any 2 is encountered             for j in range(ones):                 print("1", end = "")            # If Str1[i] = 0 or Str1[i] = 2         if (Str1[i] != '1'):             print(Str1[i], end = "")        # If 1s are not printed yet     if (used == False):         for j in range(ones):             print("1", end = "")    # Driver code Str1 = "100210" n = len(Str1) printString(Str1, n)    # This code is contributed # by Mohit Kumar

C#

 // C# implementation of the approach using System;    class GFG  {    // Function to print the required string static void printString(char[] str, int n) {     // count number of 1s     int ones = 0;     for (int i = 0; i < n; i++)         if (str[i] == '1')             ones++;        // To check if the all the 1s     // have been used or not     bool used = false;        for (int i = 0; i < n; i++)      {         if (str[i] == '2' && !used)          {             used = true;                // Print all the 1s if any 2 is encountered             for (int j = 0; j < ones; j++)                 Console.Write("1");         }            // If str[i] = 0 or str[i] = 2         if (str[i] != '1')             Console.Write(str[i]);        }        // If 1s are not printed yet     if (!used)         for (int j = 0; j < ones; j++)             Console.Write("1"); }    // Driver code public static void Main(String[] args)  {     String str = "100210";     int n = str.Length;     printString(str.ToCharArray(), n); } }    // This code has been contributed by 29AjayKumar

PHP



Output:

001120

My Personal Notes arrow_drop_up Check out this Author's contributed articles.

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.

Article Tags :
Practice Tags :

Be the First to upvote.

Please write to us at contribute@geeksforgeeks.org to report any issue with the above content.