TheAlgorithms/C++ 1.0.0
All the algorithms implemented in C++
Loading...
Searching...
No Matches
palindrome_partitioning.cpp
Go to the documentation of this file.
1
19#include <algorithm> // for std::min
20#include <cassert> // for std::assert
21#include <climits> // for INT_MAX
22#include <iostream> // for io operations
23#include <vector> // for std::vector
24
29namespace dynamic_programming {
30
38
45int pal_part(const std::string &str) {
46 int n = str.size();
47
48 // creating lookup table for minimum number of cuts
49 std::vector<std::vector<int> > cuts(n, std::vector<int>(n, 0));
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}
91} // namespace palindrome_partitioning
92} // namespace dynamic_programming
93
98static void test() {
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] =
107 dynamic_programming::palindrome_partitioning::pal_part(
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}
123
128int main() {
129 test(); // execute the test
130 return 0;
131}
Dynamic Programming algorithms.
Functions for Palindrome Partitioning algorithm.
static void test()
Test Function.
int main()
Main function.