Implementation of Manacher's Algorithm
More...
#include <cassert>
#include <iostream>
#include <vector>
#include <cstring>
Implementation of Manacher's Algorithm
Manacher's Algorithm is used to find the longest palindromic substring within a string in O(n) time. It exploits the property of a palindrome that its first half is symmetric to the last half, and thus if the first half is a palindrome, then last half is also a palindrome.
- Author
- Riti Kumari
◆ main()
Main function.
- Returns
- 0 on exit
static void test()
Self-test implementations.
Definition: manacher_algorithm.cpp:150
◆ manacher()
A function that implements Manacher's algorithm.
- Parameters
-
| prototype | is the string where algorithm finds a palindromic substring. This string can contain any character except @ # & |
- Returns
- the largest palindromic substring
41 if (prototype.
size() > 0) {
45 for (
auto str : prototype) {
46 stuffed_string += str;
47 stuffed_string +=
"#";
49 stuffed_string =
"@#" + stuffed_string +
"&";
52 stuffed_string.
size(),
58 uint64_t bigger_center =
68 for (uint64_t i = 1; i < stuffed_string.
size() - 1; i++) {
71 uint64_t opposite_to_i =
80 palindrome_max_half_length[i] =
std::min(
81 palindrome_max_half_length[opposite_to_i], right - i);
86 while (stuffed_string[i + (palindrome_max_half_length[i] + 1)] ==
87 stuffed_string[i - (palindrome_max_half_length[i] + 1)]) {
88 palindrome_max_half_length[i]++;
95 if (i + palindrome_max_half_length[i] > right) {
97 right = i + palindrome_max_half_length[i];
102 uint64_t half_length = 0;
103 uint64_t center_index = 0;
105 for (uint64_t i = 1; i < stuffed_string.
size() - 1; i++) {
106 if (palindrome_max_half_length[i] > half_length) {
107 half_length = palindrome_max_half_length[i];
115 if (half_length > 0) {
121 center_index - half_length +
124 center_index + half_length -
126 for (uint64_t index = start; index <=
end; index += 2) {
127 palindromic_substring += stuffed_string[index];
133 palindromic_substring = prototype[0];
135 return palindromic_substring;
◆ test()
Self-test implementations.
- Returns
- void
151 assert(strings::manacher::manacher(
"") ==
"");
152 assert(strings::manacher::manacher(
"abababc") ==
"ababa");
153 assert(strings::manacher::manacher(
"cbaabd") ==
"baab");
154 assert(strings::manacher::manacher(
"DedzefDeD") ==
"DeD");
155 assert(strings::manacher::manacher(
"XZYYXXYZXX") ==
"YXXY");
156 assert(strings::manacher::manacher(
"1sm222m10abc") ==
"m222m");
157 assert(strings::manacher::manacher(
"798989591") ==
"98989");
158 assert(strings::manacher::manacher(
"xacdedcax") ==
"xacdedcax");
159 assert(strings::manacher::manacher(
"xaccax") ==
"xaccax");
160 assert(strings::manacher::manacher(
"a") ==
"a");
161 assert(strings::manacher::manacher(
"xy") ==
"x");
162 assert(strings::manacher::manacher(
"abced") ==
"a");