Algorithms_in_C++  1.0.0
Set of algorithms implemented in C++.
palindrome_partitioning.cpp File Reference

Implements Palindrome Partitioning algorithm, giving you the minimum number of partitions you need to make. More...

#include <algorithm>
#include <cassert>
#include <climits>
#include <iostream>
#include <vector>
Include dependency graph for palindrome_partitioning.cpp:

Namespaces

 dynamic_programming
 Dynamic Programming algorithms.
 
 palindrome_partitioning
 Functions for Palindrome Partitioning algorithm.
 

Functions

int dynamic_programming::palindrome_partitioning::pal_part (const std::string &str)
 
static void test ()
 Test Function. More...
 
int main ()
 Main function. More...
 

Detailed Description

Implements Palindrome Partitioning algorithm, giving you the minimum number of partitions you need to make.

palindrome partitioning uses dynamic programming and goes to all the possible partitions to find the minimum you are given a string and you need to give minimum number of partitions needed to divide it into a number of palindromes Palindrome Partitioning overall time complexity O(n^2) For example: example 1:- String : "nitik" Output : 2 => "n | iti | k" For example: example 2:- String : "ababbbabbababa" Output : 3 => "aba | b | bbabb | ababa"

Author
Sujay Kaushik

Function Documentation

◆ main()

int main ( void  )

Main function.

Returns
0 on exit
128  {
129  test(); // execute the test
130  return 0;
131 }
static void test()
Test Function.
Definition: palindrome_partitioning.cpp:98
Here is the call graph for this function:

◆ pal_part()

int dynamic_programming::palindrome_partitioning::pal_part ( const std::string str)

Function implementing palindrome partitioning algorithm using lookup table method.

Parameters
strinput string
Returns
minimum number of partitions
45  {
46  int n = str.size();
47 
48  // creating lookup table for minimum number of cuts
50 
51  // creating lookup table for palindrome checking
52  std::vector<std::vector<bool> > is_palindrome(n,
53  std::vector<bool>(n, false));
54 
55  // initialization
56  for (int i = 0; i < n; i++) {
57  is_palindrome[i][i] = true;
58  cuts[i][i] = 0;
59  }
60 
61  for (int len = 2; len <= n; len++) {
62  for (int start_index = 0; start_index < n - len + 1; start_index++) {
63  int end_index = start_index + len - 1;
64 
65  if (len == 2) {
66  is_palindrome[start_index][end_index] =
67  (str[start_index] == str[end_index]);
68  } else {
69  is_palindrome[start_index][end_index] =
70  (str[start_index] == str[end_index]) &&
71  is_palindrome[start_index + 1][end_index - 1];
72  }
73 
74  if (is_palindrome[start_index][end_index]) {
75  cuts[start_index][end_index] = 0;
76  } else {
77  cuts[start_index][end_index] = INT_MAX;
78  for (int partition = start_index; partition <= end_index - 1;
79  partition++) {
80  cuts[start_index][end_index] =
81  std::min(cuts[start_index][end_index],
82  cuts[start_index][partition] +
83  cuts[partition + 1][end_index] + 1);
84  }
85  }
86  }
87  }
88 
89  return cuts[0][n - 1];
90 }
T min(T... args)
int partition(int arr[], int low, int high)
Definition: quick_sort.cpp:37
T size(T... args)
Here is the call graph for this function:

◆ test()

static void test ( )
static

Test Function.

Returns
void
98  {
99  // custom input vector
100  std::vector<std::string> custom_input{"nitik", "ababbbabbababa", "abdc"};
101 
102  // calculated output vector by pal_part Function
103  std::vector<int> calculated_output(3);
104 
105  for (int i = 0; i < 3; i++) {
106  calculated_output[i] =
108  custom_input[i]);
109  }
110 
111  // expected output vector
112  std::vector<int> expected_output{2, 3, 3};
113 
114  // Testing implementation via assert function
115  // It will throw error if any of the expected test fails
116  // Else it will give nothing
117  for (int i = 0; i < 3; i++) {
118  assert(expected_output[i] == calculated_output[i]);
119  }
120 
121  std::cout << "All tests passed successfully!\n";
122 }
int pal_part(const std::string &str)
Definition: palindrome_partitioning.cpp:45