- 팰린드롬이란,
- 회문(回文) 또는 팰린드롬(palindrome)은 거꾸로 읽어도 제대로 읽는 것과 같은 문장이나 낱말, 숫자, 문자열(sequence of characters)
- 팰린드롬 알고리즘
- 첫 문자와 끝 문자부터 시작하여 차례차례 비교: O(N)의 시간복잡도
1) Brute Force: 존재하는 모든 부분 문자열에 대해 회문 여부 검사
2) Dynamic Programming: Memoization = 가장 작은 부분의 해답을 구한 뒤 이를 저장하고, 저장한 값을 이용하여 상위 문제를 해결 -> 시간복잡도가 더 낮으므로, 이 방법으로 코드 작성
#include <iostream>
#include <algorithm>
#include <string>
#include <cstring>
using namespace std;
int n;
string str;
bool dp[2501][2501];
int cache[2501];
int solve(int end) {
if (end == 0) return 1;
int &ret = cache[end];
if (ret != -1) return ret;
int ans = 987654321;
for (int i = 0; i <= end; i++) {
if (dp[i][end])
{
ans = min(ans, solve(i-1) + 1);
}
}
return ret = ans;
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> str;
n = str.length();
memset(cache, -1, sizeof(cache));
memset(dp, false, sizeof(dp));
for (int i = 0; i < n; i++)
{
dp[i][i] = true;
}
for (int i = 0; i < n - 1; i++)
if (str[i] == str[i + 1])
{
dp[i][i+1] = true;
}
for (int i = 3; i <= n; i++) {
for (int s = 0; s < n - i + 1; s++)
{
int e = s + i - 1;
if (str[s] == str[e] && dp[s + 1][e - 1])
{
dp[s][e] = true;
}
}
}
cout << solve(str.length() - 1) << '\n';
}