[Programmers] 가장 긴 팰린드롬

Date:

[Programmers] 가장 긴 팰린드롬

Problem URL : 가장 긴 팰린드롬

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string>

using namespace std;

const int MAXN = 5000;
int A[MAXN];

string str;

void manachers(string S, int N){
    int r = 0, p = 0;
    for (int i = 0; i < N; i++){
        if (i <= r)
            A[i] = min(A[2 * p - i], r - i);
        else
            A[i] = 0;
        
        while (i - A[i] - 1 >= 0 && i + A[i] + 1 < N && S[i - A[i] - 1] == S[i + A[i] + 1])
            A[i]++;
        
        if (r < i + A[i]){
            r = i + A[i];
            p = i;
        }
    }
}

int solution(string s){
    int len = (int)s.size();
    
    for (int i = 0; i < len; i++)
    {
        str += '#';
        str += s[i];
    }
    str += '#';
    
    manachers(str, (int)str.size());
    
    len = (int)str.size();
    int ans = -1;
    for (int i = 0; i < len; i++)
        ans = max(ans, A[i]);
    
    return ans;
}

Comments

유명한 알고리즘
문자열 첫번째부터 탐색하면서, 탐색했던 팰린드롬 정보를 최대한 활용한다.
2 * p - i 는 p - (i - p) 로 이해하면 된다.
i에 관한 정보는 p를 기준으로 (i - p)만큼 이전 위치의 문자로부터 얻을 수 있기 떄문이다
(p를 기준으로 팰린드롬이니까!)

댓글