Official

D - Longest Palindrome Editorial by cn449


\(S\) のすべての連続する部分文字列に対し、それが回文か判定すればよいです。 長さ \(N\) の文字列は \(O(N)\) の時間計算量で回文か判定でき、\(S\) の連続する部分文字列は \(O(|S|^2)\) 個存在するため、全体として \(O(|S|^3)\) の時間計算量で解くことができました。

実装例

#include <iostream>
#include <algorithm>
#include <string>
using namespace std;

bool is_palindrome(string s) {
	int n = s.size();
	for (int i = 0; i < n; i++) if (s[i] != s[n - i - 1]) return false;
	return true;
}

int main() {
	string s;
	cin >> s;
	int n = s.size();
	int ans = 1;
	for (int i = 0; i < n; i++) {
		for (int j = i + 1; j <= n; j++) {
			string t = "";
			for (int k = i; k < j; k++) t += s[k];
			if (is_palindrome(t)) ans = max(ans, j - i);
		}
	}
	cout << ans << '\n';
}

posted:
last update: