Minimum number of palindromic subsequences to be removed to empty a binary string
Last Updated :
20 Feb, 2023
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++
// C++ program to count minimum palindromic subsequences
// to be removed to make an string empty.
#include <bits/stdc++.h>
using namespace std;
// A function to check if a string str is palindrome
bool isPalindrome(const char *str)
{
// Start from leftmost and rightmost corners of str
int l = 0;
int h = strlen(str) - 1;
// Keep comparing characters while they are same
while (h > l)
if (str[l++] != str[h--])
return false;
return true;
}
// Returns count of minimum palindromic subsequences to
// be removed to make string empty
int minRemovals(const char *str)
{
// If string is empty
if (str[0] == '\0')
return 0;
// If string is palindrome
if (isPalindrome(str))
return 1;
// If string is not palindrome
return 2;
}
// Driver code to test above
int main()
{
cout << minRemovals("010010") << endl;
cout << minRemovals("0100101") << endl;
return 0;
}
Java
// Java program to count minimum palindromic
// subsequences to be removed to make
// an string empty.
import java.io.*;
class GFG {
// A function to check if a string
// str is palindrome
static boolean isPalindrome(String str)
{
// Start from leftmost and rightmost
// corners of str
int l = 0;
int h = str.length() - 1;
// Keep comparing characters
// while they are same
while (h > l)
if (str.charAt(l++) != str.charAt(h--))
return false;
return true;
}
// Returns count of minimum palindromic
// subsequences to be removed to
// make string empty
static int minRemovals(String str)
{
// If string is empty
if (str.charAt(0) == '')
return 0;
// If string is palindrome
if (isPalindrome(str))
return 1;
// If string is not palindrome
return 2;
}
// Driver code to test above
public static void main (String[] args)
{
System.out.println (minRemovals("010010"));
System.out.println (minRemovals("0100101"));
}
}
// This code is contributed by vt_m.
Python3
# Python program to count minimum
# palindromic subsequences to
# be removed to make an string
# empty.
# A function to check if a
# string str is palindrome
def isPalindrome(str):
# Start from leftmost and
# rightmost corners of str
l = 0
h = len(str) - 1
# Keep comparing characters
# while they are same
while (h > l):
if (str[l] != str[h]):
return 0
l = l + 1
h = h - 1
return 1
# Returns count of minimum
# palindromic subsequences to
# be removed to make string
# empty
def minRemovals(str):
#If string is empty
if (str[0] == ''):
return 0
#If string is palindrome
if (isPalindrome(str)):
return 1
# If string is not palindrome
return 2
# Driver code
print(minRemovals("010010"))
print(minRemovals("0100101"))
# This code is contributed by Sam007.
C#
// C# program to count minimum palindromic
// subsequences to be removed to make
// an string empty.
using System;
class GFG
{
// A function to check if a
// string str is palindrome
static bool isPalindrome(String str)
{
// Start from leftmost and
// rightmost corners of str
int l = 0;
int h = str.Length - 1;
// Keep comparing characters
// while they are same
while (h > l)
if (str[l++] != str[h--])
return false;
return true;
}
// Returns count of minimum palindromic
// subsequences to be removed to
// make string empty
static int minRemovals(String str)
{
// If string is empty
if (str[0] == '')
return 0;
// If string is palindrome
if (isPalindrome(str))
return 1;
// If string is not palindrome
return 2;
}
// Driver code to
public static void Main ()
{
Console.WriteLine(minRemovals("010010"));
Console.WriteLine(minRemovals("0100101"));
}
}
// This code is contributed by Sam007
PHP
<?php
// PHP program to count minimum
// palindromic subsequences to
// be removed to make an string empty.
// A function to check if a
// string str is palindrome
function isPalindrome($str)
{
// Start from leftmost and
// rightmost corners of str
$l = 0;
$h = strlen($str) - 1;
// Keep comparing characters
// while they are same
while ($h > $l)
if ($str[$l++] != $str[$h--])
return false;
return true;
}
// Returns count of minimum
// palindromic subsequences
// to be removed to make
// string empty
function minRemovals($str)
{
// If string is empty
if ($str[0] == '')
return 0;
// If string is palindrome
if (isPalindrome($str))
return 1;
// If string is not palindrome
return 2;
}
// Driver Code
echo minRemovals("010010"), "\n";
echo minRemovals("0100101") , "\n";
// This code is contributed by ajit
?>
JavaScript
<script>
// Javascript program to count
// minimum palindromic
// subsequences to be removed to make
// an string empty.
// A function to check if a
// string str is palindrome
function isPalindrome(str)
{
// Start from leftmost and
// rightmost corners of str
let l = 0;
let h = str.length - 1;
// Keep comparing characters
// while they are same
while (h > l)
if (str[l++] != str[h--])
return false;
return true;
}
// Returns count of minimum palindromic
// subsequences to be removed to
// make string empty
function minRemovals(str)
{
// If string is empty
if (str[0] == '')
return 0;
// If string is palindrome
if (isPalindrome(str))
return 1;
// If string is not palindrome
return 2;
}
// Driver Code
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.