Palindrome Partitioning II in C++


Suppose we have a string s, we have to find the number of cuts needed to divide this string into different substring and each part is a palindrome. So if the string is like “ababba”, then this will take 2 cuts. [aba|bb|a]

To solve this, we will follow these steps −

  • n := number of characters in the string s

  • create one array called res of size n + 1

  • res[n] := -1

  • for i in range n – 1 down to 0

    • res[i] := n – i – 1

    • for j in range i to n

      • if substring of a, from index i, to j – i is a palindrome, then

        • res[i] := min of res[i] and 1 + res[j + 1]

  • return res[0]

Example

Let us see the following implementation to get a better understanding −

 Live Demo

#include <bits/stdc++.h>
using namespace std;
bool isPalindrome(string A) {
   int left = 0;
   int right = A.size()-1;
   while(left < right) {
      if(A[left] != A[right]) {
         return 0;
      }
      left++;
      right--;
   }
   return 1;
}
int solve(string A) {
   int n = A.size();
   vector<int>result(n+1);
   result[n] = -1;
   for(int i=n-1;i>=0;i--) {
      result[i] = n-i-1;
      for(int j=i;j<n;j++) {
         if(isPalindrome(A.substr(i, j-i+1))) {
            result[i] = min(result[i], 1 + result[j+1]);
         }
      }
   }
   return result[0];
}
class Solution {
   public:
   int minCut(string s) {
      return solve(s);
   }
};
main(){
   Solution ob;
   cout << (ob.minCut("ababba"));
}

Input

“ababba”

Output

2

Updated on: 26-May-2020

94 Views

Kickstart Your Career

Get certified by completing the course

Get Started
Advertisements