📌  相关文章
📜  要删除的最小回文子序列数以清空二进制字符串

📅  最后修改于: 2022-05-13 01:57:07.392000             🧑  作者: Mango

要删除的最小回文子序列数以清空二进制字符串

给定一个二进制字符串,计算要删除的最小子序列数,使其成为空字符串。
例子 :

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.

预期时间复杂度:O(n)

我们强烈建议您单击此处并进行练习,然后再继续使用解决方案。

这个问题很简单,可以使用以下两个事实轻松解决。
1)如果给定的字符串是回文,我们只需要删除一次。
2)否则我们需要两次移除。请注意,每个二进制字符串都将全 1 作为子序列,将全 0 作为另一个子序列。我们可以删除两个子序列中的任何一个来获得一元字符串。一元字符串总是回文。

C++
// C++ program to count minimum palindromic subsequences
// to be removed to make an string empty.
#include 
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] == '')
      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
 $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


输出 :

1
2

练习:

  1. 扩展上述解决方案以计算要删除的最小子序列数,使其成为空字符串。
  2. 三元字符串的最大计数是多少