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

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

filter_none

edit
close

play_arrow

link
brightness_4
code

// 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;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// 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 */

chevron_right


Python3

filter_none

edit
close

play_arrow

link
brightness_4
code

# 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 

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

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

chevron_right


PHP

filter_none

edit
close

play_arrow

link
brightness_4
code

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

chevron_right


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.