Я отправляю это от имени друга, так как считаю это довольно интересным:
Возьмите строку «abb». Если исключить любое количество букв, меньшее длины строки, мы получим 7 строк.
a b b ab ab bb abb
Из них 4 - палиндромы.
Аналогично для строки
"hihellolookhavealookatthispalindromexxqwertyuiopasdfghjklzxcvbnmmnbvcxzlkjhgfdsapoiuytrewqxxsoundsfamiliardoesit"
(длина строки 112) 2 ^ 112 - может быть сформирована 1 строка.
Сколько из них палиндромов ??
Ниже представлена его реализация (хотя и на C ++, C тоже подойдет). Это довольно медленно с очень длинными словами; он хочет знать, какой самый быстрый алгоритм возможен для этого (и мне тоже любопытно: D).
#include <iostream>
#include <cstring>
using namespace std;
void find_palindrome(const char* str, const char* max, long& count)
{
for(const char* begin = str; begin < max; begin++) {
count++;
const char* end = strchr(begin + 1, *begin);
while(end != NULL) {
count++;
find_palindrome(begin + 1, end, count);
end = strchr(end + 1, *begin);
}
}
}
int main(int argc, char *argv[])
{
const char* s = "hihellolookhavealookatthis";
long count = 0;
find_palindrome(s, strlen(s) + s, count);
cout << count << endl;
}