longest_plalindrome
O(n)的算法
#include <iostream> #include <string> #include <vector> #include <algorithm> using namespace std; int LongestPlalindrome(const string& str) { if (str.empty()) return 0; string recombined_str; max_len = 1; recombined_str.resize(2 * str.size() - 1); for (int i = 0; i < str.size() - 1; ++i) { recombined_str[2*i] = str[i]; recombined_str[2*i + 1] = '#'; } vector<int> pld_len; pld_len.resize(recombined_str.size(), 1); int farrest_match = 0; int match_pos = 0; for (int i = 1; i < recombined_str.size(); ++i) { if (farrest_match > i) { pld_len[i] = min(pld_len(2 * match_pos - i), farrest_match - i); } int len = pld_len[i]; while (i - len >= 0 && i + len <= recombined_str.size() - 1 && recombined_str[i - len] == recombined_str[i + len]) { ++len; pld_len[i]++; farrest_match++; match_pos = i; } max_len = max(max_len, pld_len[i]); } return max_len; }
Passion, patience, perseverance, keep it and move on.

浙公网安备 33010602011771号