티스토리 뷰
https://algospot.com/judge/problem/read/PALINDROMIZE
문제설명은 알고스팟에서 참고하세요.
팰린드롬 문제를 풀기 위해는 먼저 직전의 알고리즘 게시물인
http://puppyrush.tistory.com/26
을 이해할 필요가 있습니다.
물론 다른 방법들도 존재하겠지만요.
팰린드롬을 만들기전에 조건인 제일 짧은 팰린드롬을 만들어야 한다에 주안점을 두어야겠습니다.
가령 anon이라는 문자열로 팰린드롬을 만들려 한다면
anon을 뒤집어 연결시킨 anonona도 팰린드롬이 됩니다.
하지만 제일 짧은 팰린드롬은 anona입니다. a하나만 붙은것이죠.
어떻게 하면 짧은 팰린드롬을 만들어낼 수 있을까요
해법중 하나로 원본 문자열을 뒤집어 kmp알고리즘으로 해결하듯이
접근하는것입니다.
0 |
1 |
2 |
3 |
4 |
5 |
6 |
a |
n |
o |
n |
|
|
|
n |
o |
n |
a |
|
|
|
다음처럼 원본문자열과 순서가 뒤집힌 문자열을 대조합니다.
맨 처음부터 일치한다면 그 자체가 팰린드롬이겠습니다.
0 | 1 | 2 | 3 | 4 | 5 | 6 |
a | n | o | n |
|
|
|
n | o | n | a |
|
|
두 문자열이 겹치는 구간중 모두 일치하면 이때 바로 가장 짧은 팰린드롬을 완성할 수 있습니다.
0 | 1 | 2 | 3 | 4 | 5 | 6 |
a | n | o | n |
|
|
|
n | o | n | a |
물론 이 상황에서도 팰린드롬은 가능하지만 제일 짧은 팰린드롬은 아닙니다.
정리하자면 팰린드롬은 H[m...n] (n=len(H)) 구간과 N[m...n] (m=len(N))이 일치하면 가능합니다.
다시말해 겹치는 두 문자열이 겹치는 구간 중 연속하여 일치하면 된다는 의미입니다.
이를 알고리즘으로 표현하면 위와 같습니다.
kmp알고리즘과 거의 일치하며 팰린드롬 문제를 풀기위해 32,33번줄이 변경된것에 유의하시면 됩니다.
H[m...n] = N[m...n]임을 확인후에 제일 짧은 문자열의 길이를 반환한것입니다.
'프로그래밍 > Algorithm_DataStructure' 카테고리의 다른 글
트리 순회 순서 변경 (0) | 2017.02.21 |
---|---|
재하의 금고1 (문자열, 환형시프트) (0) | 2017.02.16 |
KMP알고리즘 (0) | 2017.02.12 |
원주율 외우기 (0) | 2017.01.28 |
LIS (Longest Increasing Sequence) / 최대 증가 부분수열 알고리즘1 (0) | 2017.01.26 |
- Total
- Today
- Yesterday
- 코드잼
- 사천
- regex
- cpp
- C language
- yiruma
- 정규표현식
- Algorithm
- peram jam
- link
- 피아노
- 드럼
- Codejam
- python
- 이루마
- 중국여행
- 카카오 공채
- Pointer
- compile
- kernerl
- 알고리즘
- printf
- 문자열
- 악보
- 여행
- Spring
- C++
- linux
- 중국
- STL
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |