Skip to content
Related Articles

Related Articles

Improve Article

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

  • Last Updated : 01 Jun, 2021

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 an 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 
 

 

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 <bits/stdc++.h>
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 print the 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
 
            # Print all 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




<?php
// PHP implementation of the approach
 
// Function to print the required string
function printString($str, $n)
{
    // count number of 1s
    $ones = 0;
    for ($i = 0; $i < $n; $i++)
        if ($str[$i] == '1')
            $ones++;
 
    // To check if the all the 1s
    // have been used or not
    $used = false;
 
    for ($i = 0; $i < $n; $i++)
    {
        if ($str[$i] == '2' && !$used)
        {
            $used = 1;
 
            // Print all the 1s if any 2
            // is encountered
            for ($j = 0; $j < $ones; $j++)
                echo "1";
        }
 
        // If str[i] = 0 or str[i] = 2
        if ($str[$i] != '1')
            echo $str[$i];
    }
 
    // If 1s are not printed yet
    if (!$used)
        for ($j = 0; $j < $ones; $j++)
            echo "1";
}
 
// Driver code
$str = "100210";
$n = strlen($str);
printString($str, $n);
 
// This code is contributed by Ryuga
?>

Javascript




<script>
 
    // JavaScript implementation of the approach
     
    // Function to print the required string
    function printString(str, n)
    {
        // count number of 1s
        let ones = 0;
        for (let i = 0; i < n; i++)
            if (str[i] == '1')
                ones++;
 
        // To check if the all the 1s
        // have been used or not
        let used = false;
 
        for (let i = 0; i < n; i++)
        {
            if (str[i] == '2' && !used)
            {
                used = true;
 
                // Print all the 1s if any 2 is encountered
                for (let j = 0; j < ones; j++)
                    document.write("1");
            }
 
            // If str[i] = 0 or str[i] = 2
            if (str[i] != '1')
                document.write(str[i]);
 
        }
 
        // If 1s are not printed yet
        if (!used)
            for (let j = 0; j < ones; j++)
                document.write("1");
    }
     
    let str = "100210";
    let n = str.length;
    printString(str.split(''), n);
     
</script>
Output: 
001120

 

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.  To complete your preparation from learning a language to DS Algo and many more,  please refer Complete Interview Preparation Course.

In case you wish to attend live classes with experts, please refer DSA Live Classes for Working Professionals and Competitive Programming Live for Students.




My Personal Notes arrow_drop_up
Recommended Articles
Page :