티스토리 뷰
728x90
문제 설명
앞뒤를 뒤집어도 똑같은 문자열을 팰린드롬(palindrome)이라고 합니다.
문자열 s가 주어질 때, s의 부분 문자열(Substring)중 가장 긴 팰린드롬의 길이를 return 하는 solution 함수를 완성해 주세요.
예를 들면, 문자열 s가 abcdcba이면 7을 return 하고abacde이면 3을 return 합니다.
제한 조건
- 문자열 s의 길이 : 2,500 이하의 자연수
- 문자열 s는 알파벳 소문자로만 구성
입출력 예
s | answer |
"abcdcba" | 7 |
"abacde" | 3 |
코드
#include <string>
#include <vector>
using namespace std;
// d[i][j]는 s[i]부터 s[j]까지의 문자열이 팰린드롬인지를 의미함
// -1 : 확인되지 않음
// 0 : 팰린드롬 X
// 1 : 팰린드롬 O
vector<vector<int>> d;
int dp(int start, int end, string &s)
{
if (start >= end)
return 1;
// 이미 확인됐다면 결과를 리턴
if (d[start][end] != -1)
return d[start][end];
if (s[start] == s[end])
d[start][end] = dp(start + 1, end - 1, s);
else
d[start][end] = 0;
return d[start][end];
}
int solution(string s)
{
vector<int> v;
int i, start, len;
// d를 -1로 초기화
v.resize(s.size(), -1);
for (i = 0; i < s.size(); i++)
{
d.push_back(v);
}
// 가장 긴 팰린드롬을 찾아야하기 때문에 가장 긴 길이부터 확인
for (len = s.size(); len > 0; len--)
{
for (start = 0; start + len <= s.size(); start++)
{
// 팰린드롬을 찾으면 길이를 리턴 (최댓값)
if (dp(start, start + len - 1, s))
{
return len;
}
}
}
}
링크
programmers.co.kr/learn/courses/30/lessons/12904
728x90
'Coding Test > Programmers' 카테고리의 다른 글
[프로그래머스] 블록 이동하기 / C++ (0) | 2021.02.20 |
---|---|
[프로그래머스] 기둥과 보 설치 / C++ (0) | 2021.02.18 |
[프로그래머스] 보행자 천국 / C++ (0) | 2021.02.15 |
[프로그래머스] 베스트앨범 / C++ (0) | 2021.02.14 |
[프로그래머스] 신규 아이디 추천 / C++ (0) | 2021.02.13 |