TheAlgorithms/C++
1.0.0
All the algorithms implemented in C++
Toggle main menu visibility
Loading...
Searching...
No Matches
palindrome_partitioning.cpp
Go to the documentation of this file.
1
18
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
29
namespace
dynamic_programming
{
30
37
namespace
palindrome_partitioning
{
38
45
int
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
98
static
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
128
int
main
() {
129
test
();
// execute the test
130
return
0;
131
}
test
void test()
Definition
caesar_cipher.cpp:100
main
int main()
Main function.
Definition
generate_parentheses.cpp:110
dynamic_programming
Dynamic Programming algorithms.
palindrome_partitioning
Functions for Palindrome Partitioning algorithm.
dynamic_programming::palindrome_partitioning::pal_part
int pal_part(const std::string &str)
Definition
palindrome_partitioning.cpp:45
dynamic_programming
palindrome_partitioning.cpp
Generated by
1.18.0