Home LeetCode - 5. Longest Palindromic Substring
Post
Cancel

LeetCode - 5. Longest Palindromic Substring

5. Longest Palindromic Substring - medium

문제

Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of s is 1000.

제한사항

입출력 예

1
2
3
4
5
6
7
8
Example 1:
Input: "babad"
Output: "bab"
Note: "aba" is also a valid answer.

Example 2:
Input: "cbbd"
Output: "bb"

풀이

  • String, Array
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
class Solution {
public:
    string longestPalindrome(string s) {
        if(s.size() < 2)
            return s;

        string answer = "";

        for(auto index = 1 ; index < s.size() ; ++index){
            string oddRes = {s[index]}, evenRes = {s[index]};
            int oddLeft = index - 1, oddRight = index + 1;
            int evenLeft = index - 1, evenRight = index;
            bool oddFlag = false, evenFlag = false;

            while(1){
                // 문자열의 길이가 홀수인 sub palindrome 검색
                // 문자열의 길이가 홀수 이므로 현재 index를 기준으로 잡고,
                // 양쪽의 index를 --left, ++right 하여 각 문자르 비교해 sub palindrome 탐색
                if((oddLeft >= 0 && oddRight < s.size()) && (s[oddLeft] == s[oddRight])){
                    oddRes = s.substr(oddLeft, oddRight - oddLeft + 1);
                    --oddLeft;
                    ++oddRight;
                }
                // 비교시 같지 않다면 트리거를 true로 변환
                else{
                    oddFlag = true;
                }

                // 문자열의 길이가 짝수인 sub palindrome 검색
                // 문자열의 길이가 짝수 이므로 초기 right의 index를 중앙 index로 기준을 잡고,
                // 양쪽의 index를 --left, ++right 하여 각 문자르 비교해 sub palindrome 탐색
                if((evenLeft >= 0 && evenRight < s.size()) && (s[evenLeft] == s[evenRight])){
                    evenRes = s.substr(evenLeft, evenRight - evenLeft + 1);
                    --evenLeft;
                    ++evenRight;
                }
                // 비교시 같지 않다면 트리거를 true로 변환
                else{
                   evenFlag = true;
                }

                // 짝수, 홀수 모두 트리거가 true면,
                // 현재 index기준으 sub palindrome 탐색완료
                if(oddFlag && evenFlag)
                    break;
            }

            // 문자열의 길이가 긴 palindrome을 선택
            auto sub =  oddRes.size() > evenRes.size() ? oddRes : evenRes;
            answer = answer.size() > sub.size() ? answer : sub;
        }

        return answer;
    }
};
This post is licensed under CC BY 4.0 by the author.