# Exercise - Minimum Deletions in a String to make it a Palindrome

這題挺不錯的,算是這系列的活用題:

解法一 - DP

using namespace std;

#include <iostream>
#include <string>
#include <vector>

class MDSP {

public:
  int findMinimumDeletions(const string &st) {
    // subtracting the length of Longest Palindromic Subsequence from the length of
    // the input string to get minimum number of deletions
    return st.length() - findLPSLength(st);
  }

  int findLPSLength(const string &st) {
    // dp[i][j] stores the length of LPS from index 'i' to index 'j'
    vector<vector<int>> dp(st.length(), vector<int>(st.length()));

    // every sequence with one element is a palindrome of length 1
    for (int i = 0; i < st.length(); i++) {
      dp[i][i] = 1;
    }

    for (int startIndex = st.length() - 1; startIndex >= 0; startIndex--) {
      for (int endIndex = startIndex + 1; endIndex < st.length(); endIndex++) {
        // case 1: elements at the beginning and the end are the same
        if (st[startIndex] == st[endIndex]) {
          dp[startIndex][endIndex] = 2 + dp[startIndex + 1][endIndex - 1];
        } else { // case 2: skip one element either from the beginning or the end
          dp[startIndex][endIndex] =
              max(dp[startIndex + 1][endIndex], dp[startIndex][endIndex - 1]);
        }
      }
    }
    return dp[0][st.length() - 1];
  }
};

int main(int argc, char *argv[]) {
  MDSP *mdsp = new MDSP();
  cout << mdsp->findMinimumDeletions("abdbca") << endl;
  cout << mdsp->findMinimumDeletions("cddpd") << endl;
  cout << mdsp->findMinimumDeletions("pqr") << endl;

  delete mdsp;
}

Last updated