Minimum number of deletions to make a string palindrome

3.3

Given a string of size ‘n’. The task is to remove or delete minimum number of characters from the string so that the resultant string is palindrome.

Note: The order of characters should be maintained.

Examples:

Input : aebcbda
Output : 2
Remove characters 'e' and 'd'
Resultant string will be 'abcba'
which is a palindromic string

Input : geeksforgeeks
Output : 8

A simple solution is to remove all subsequences one by one and check if remaining string is palindrome or not. Time complexity of this solution is exponential.

An efficient approach uses the concept of finding the length of the longest palindromic subsequence of a given sequence.

Algorithm:

-->str is the given string.
-->n length of str
-->len be the length of the longest 
   palindromic subsequence of str
-->// minimum number of deletions 
   min = n - len

C++

// C++ implementation to find minimum number
// of deletions to make a string palindromic
#include <bits/stdc++.h>
using namespace std;

// Returns the length of the longest
// palindromic subsequence in 'str'
int lps(string str)
{
    int n = str.size();

    // Create a table to store
    // results of subproblems
    int L[n][n];

    // Strings of length 1
    // are palindrome of length 1
    for (int i = 0; i < n; i++)
        L[i][i] = 1;

    // Build the table. Note that the lower diagonal
    // values of table are useless and not filled in
    // the process. c1 is length of substring
    for (int cl=2; cl<=n; cl++)
    {
        for (int i=0; i<n-cl+1; i++)
        {
            int j = i+cl-1;
            if (str[i] == str[j] && cl == 2)
                L[i][j] = 2;
            else if (str[i] == str[j])
                L[i][j] = L[i+1][j-1] + 2;
            else
                L[i][j] = max(L[i][j-1], L[i+1][j]);
        }
    }

    // length of longest palindromic subseq
    return L[0][n-1];
}

// function to calculate minimum
// number of deletions
int minimumNumberOfDeletions(string str)
{
    int n = str.size();

    // Find longest palindromic subsequence
    int len = lps(str);

    // After removing characters other than
    // the lps, we get palindrome.
    return (n - len);
}

// Driver program to test above
int main()
{
    string str = "geeksforgeeks";
    cout << "Minimum number of deletions = "
         << minimumNumberOfDeletions(str);
    return 0;
}

Java

//Java implementation to find minimum number
//of deletions to make a string palindromic
public class MindeletetoPalin
{
    // Returns the length of the longest
    // palindromic subsequence in 'str'
    static int lps(String str)
    {
        int n = str.length();

        // Create a table to store
        // results of subproblems
        int L[][] = new int[n][n];

        // Strings of length 1
        // are palindrome of length 1
        for (int i = 0; i < n; i++)
            L[i][i] = 1;

        // Build the table. Note that the lower diagonal
        // values of table are useless and not filled in
        // the process. c1 is length of substring
        for (int cl=2; cl<=n; cl++)
        {
            for (int i=0; i<n-cl+1; i++)
            {
                int j = i+cl-1;
                if (str.charAt(i) == str.charAt(j) && cl == 2)
                    L[i][j] = 2;
                else if (str.charAt(i) == str.charAt(j))
                    L[i][j] = L[i+1][j-1] + 2;
                else
                    L[i][j] = Integer.max(L[i][j-1], L[i+1][j]);
            }
        }

        // length of longest palindromic subsequence
        return L[0][n-1];
    }

    // function to calculate minimum
    // number of deletions
    static int minimumNumberOfDeletions(String str)
    {
        int n = str.length();

        // Find longest palindromic subsequence
        int len = lps(str);

        // After removing characters other than
        // the lps, we get palindrome.
        return (n - len);
    }

    // Driver program to test above
    public static void main(String[] args)
    {
        String str = "geeksforgeeks";
        System.out.println("Minimum number of deletions = "
                           + minimumNumberOfDeletions(str));
    }
}
// This code is contributed by Sumit Ghosh


Output:

Minimum number of deletions = 8

Time Complexity: O(n2)

This article is contributed by Ayush Jauhari. 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 write comments if you find anything incorrect, or you want to share more information about the topic discussed above.

GATE CS Corner    Company Wise Coding Practice

Recommended Posts:



3.3 Average Difficulty : 3.3/5.0
Based on 18 vote(s)










Writing code in comment? Please use ide.geeksforgeeks.org, generate link and share the link here.