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++ 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 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 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# 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 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 ?> |
<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> |
001120
Time Complexity: O(n2), // since two nested loops are used the time taken by the algorithm to complete all operation is quadratic.
Auxiliary Space: O(1), no extra space is required, so it is a constant.