Given a binary string, count minimum number of subsequences to be removed to make it an empty string.
Examples :
Input: str[] = "10001"
Output: 1
Since the whole string is palindrome,
we need only one removal.
Input: str[] = "10001001"
Output: 2
We can remove the middle 1 as first
removal, after first removal string
becomes 1000001 which is a palindrome.
Expected time complexity : O(n)
The problem is simple and can be solved easily using below two facts.
- If given string is palindrome, we need only one removal.
- Else we need two removals. Note that every binary string has all 1’s as a subsequence and all 0’s as another subsequence. We can remove any of the two subsequences to get a unary string. A unary string is always palindrome.
Implementation:
C++
#include <bits/stdc++.h>
using namespace std;
bool isPalindrome( const char *str)
{
int l = 0;
int h = strlen (str) - 1;
while (h > l)
if (str[l++] != str[h--])
return false ;
return true ;
}
int minRemovals( const char *str)
{
if (str[0] == '\0' )
return 0;
if (isPalindrome(str))
return 1;
return 2;
}
int main()
{
cout << minRemovals( "010010" ) << endl;
cout << minRemovals( "0100101" ) << endl;
return 0;
}
|
Java
import java.io.*;
class GFG {
static boolean isPalindrome(String str)
{
int l = 0 ;
int h = str.length() - 1 ;
while (h > l)
if (str.charAt(l++) != str.charAt(h--))
return false ;
return true ;
}
static int minRemovals(String str)
{
if (str.charAt( 0 ) == '' )
return 0 ;
if (isPalindrome(str))
return 1 ;
return 2 ;
}
public static void main (String[] args)
{
System.out.println (minRemovals( "010010" ));
System.out.println (minRemovals( "0100101" ));
}
}
|
Python3
def isPalindrome( str ):
l = 0
h = len ( str ) - 1
while (h > l):
if ( str [l] ! = str [h]):
return 0
l = l + 1
h = h - 1
return 1
def minRemovals( str ):
if ( str [ 0 ] = = ''):
return 0
if (isPalindrome( str )):
return 1
return 2
print (minRemovals( "010010" ))
print (minRemovals( "0100101" ))
|
C#
using System;
class GFG
{
static bool isPalindrome(String str)
{
int l = 0;
int h = str.Length - 1;
while (h > l)
if (str[l++] != str[h--])
return false ;
return true ;
}
static int minRemovals(String str)
{
if (str[0] == '' )
return 0;
if (isPalindrome(str))
return 1;
return 2;
}
public static void Main ()
{
Console.WriteLine(minRemovals( "010010" ));
Console.WriteLine(minRemovals( "0100101" ));
}
}
|
PHP
<?php
function isPalindrome( $str )
{
$l = 0;
$h = strlen ( $str ) - 1;
while ( $h > $l )
if ( $str [ $l ++] != $str [ $h --])
return false;
return true;
}
function minRemovals( $str )
{
if ( $str [0] == '' )
return 0;
if (isPalindrome( $str ))
return 1;
return 2;
}
echo minRemovals( "010010" ), "\n" ;
echo minRemovals( "0100101" ) , "\n" ;
?>
|
Javascript
<script>
function isPalindrome(str)
{
let l = 0;
let h = str.length - 1;
while (h > l)
if (str[l++] != str[h--])
return false ;
return true ;
}
function minRemovals(str)
{
if (str[0] == '' )
return 0;
if (isPalindrome(str))
return 1;
return 2;
}
document.write(minRemovals( "010010" ) + "</br>" );
document.write(minRemovals( "0100101" ));
</script>
|
Time Complexity: O(n)
Auxiliary Space : O(1)
Exercises:
- Extend the above solution to count minimum number of subsequences to be removed to make it an empty string.
- What is the maximum count for ternary strings
This problem and solution are contributed by Hardik Gulati. Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above.
Feeling lost in the world of random DSA topics, wasting time without progress? It's time for a change! Join our DSA course, where we'll guide you on an exciting journey to master DSA efficiently and on schedule.
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 geeks!