×

String Coding Problems

Arrays Coding Problems

Sorting Coding Problems

Searching Coding Problems

Coding Algorithms

Tree Coding Problems

Stack Coding Problems

Linked list Coding Problems

Graph Coding Problems

Greedy Algorithms Coding Problems

Dynamic Programming Coding Problems

Matrix Coding Problems

Recursion Coding Problems

Number Theory Coding Problems

Backtracking Coding Problems

Heap Coding Problems

Brute Force Coding Problems

Implementation Coding Problems

Google Contests

Competitive Programming Coding

Miscellaneous

Find out the longest palindromic subsequence from a string

Here, we are going to learn how to find out the longest palindromic subsequence of a string using dynamic programming? Submitted by Souvik Saha, on March 31, 2020

Problem statement

Given a string you have to find out the longest palindromic subsequence from the given string.

    Input:
    T Test case
    T no of input string will be given to you.

    E.g.
    3
    
    bghaufahgt
    souabbuos
    sahajkhahas
    
    Constrain 
    1≤ length (string) ≤100
    
    Output:
    Print the longest palindromic subsequence from that string

Example

    T=3

    Input:
    bghaufahgt
    
    Output:
    ghafahg
    
    Input:
    souabbuos
    
    Output:
    soubbuos
    
    Input:
    sahajkhahas
    
    Output:
    sahajahas

Explanation with example

Let there is a string str.

Now possible arrangements are:

  1. Single middle characters like aba
  2. Paired middle characters like bb

Let, f(a,b) = length of palindromic substring from index a to index b.

Considering the above three facts:

  1. If there is only one character then f(a,a) = 1
  2. If there are two characters a and a+1 both are same then f(a,a+1) = 2 if both are not same then f(a,a+1) = 1.
  3. If there is a substring starting from index a to index b then,
    1. If str[a] and str[b] both are same then f(a,b) = f(a+1,b-1) + 2
    2. If str[a] and str[b] both are not same then f(a,b)= max{ f(a+1,b) , f(a,b-1) }

For, str = bghaufahgt

Find out the longest palindromic subsequence from a string

To find out the characters in the palindrome we will follow this approach:

  1. The max length will be the top right block.
  2. Every time we will check the left and bottom adjacent blocks.
    1. If both the blocks contain the same value then we will go for any of them.
    2. If any block contains a value such that the difference between the current value and the value at the block is 2 then we will go for that block and make a note of that character present in the string whose index is the same as the column number.
    3. When we will get the value equals to 1 then stop the traversal.
Find out the longest palindromic subsequence from a string

C++ Implementation

#include <bits/stdc++.h>
using namespace std;

int arr[101][101];

void print_palindrome(string str)
{
    int len = str.length();
    int i = 0;
    int j = len - 1;
    int num = arr[i][j];
    vector<char> v;
    int flag = 0;
    while (i < len && j >= 0) {
        if (num == 2) {
            flag = 1;
            break;
        }
        if (num == 1)
            break;
        //if the left block has the value by which
        //the difference will be 2
        if (arr[i][j - 1] + 2 == num) {
            v.push_back(str[j]);
            j--;
            num = arr[i][j];
            if (num == 1 || num == 2) {
                v.push_back(str[j]);
            }
        }
        //if the bottam block has the value by
        //which the difference will be 2
        if (arr[i + 1][j] + 2 == num) {
            v.push_back(str[i]);
            i++;
            num = arr[i][j];
            if (num == 1 || num == 2) {
                v.push_back(str[i]);
            }
        }
        if (arr[i][j - 1] == num) {
            j--;
        }
        else {
            i++;
        }
    }
    for (int i = 0; i < v.size(); i++) {
        cout << v[i];
    }
    //cout<<endl;
    for (int i = v.size() - 1; i >= 0; i--) {
        if (flag && i == v.size() - 1) {
            cout << v[i];
        }
        else if (i != v.size() - 1) {
            cout << v[i];
        }
    }
    cout << endl;
}

void length_of_palindrom(string str)
{
    int len = str.length();
    memset(arr, 0, sizeof(arr));
    for (int i = 0; i < len; i++) {
        arr[i][i] = 1;
    }
    for (int i = 0; i < len - 1; i++) {
        if (str[i] == str[i + 1])
            arr[i][i + 1] = 2;
        else
            arr[i][i + 1] = 1;
    }
    for (int l = 3; l <= len; l++) {
        for (int i = 0; i <= len - l; i++) {
            int j = i + l - 1;
            if (str[i] == str[j])
                arr[i][j] = arr[i + 1][j - 1] + 2;
            else
                arr[i][j] = max(arr[i + 1][j], arr[i][j - 1]);
        }
    }
    cout << "Palindrome : ";
    print_palindrome(str);
    cout << endl;
    return;
}

int main()
{
    int t;
    cout << "Test Case : ";
    cin >> t;
    while (t--) {
        cout << "Enter the string : ";
        string str;
        cin >> str;
        length_of_palindrom(str);
    }
}

Output

Test Case : 3
Enter the string : bghaufahgt
Palindrome : ghafahg

Enter the string : souabbuos
Palindrome : soubbuos

Enter the string : sahajkhahas
Palindrome :  sahajahas


Comments and Discussions!

Load comments ↻





Copyright © 2024 www.includehelp.com. All rights reserved.