Light Blue Pointer
본문 바로가기
Coding Test

5. Longest Palindromic Substring

by Craft Fiend 2023. 7. 20.

문제 주소

https://leetcode.com/problems/longest-palindromic-substring/

 

Longest Palindromic Substring - LeetCode

Can you solve this real interview question? Longest Palindromic Substring - Given a string s, return the longest palindromic substring in s.   Example 1: Input: s = "babad" Output: "bab" Explanation: "aba" is also a valid answer. Example 2: Input: s = "cb

leetcode.com

 

 

문제

 

Given a string s, return the longest

palindromic substring : A string is said to be a palindrome if the string read from left to right is equal to the string read from right to left.

in s

Example 1:

Input: s = "babad"
Output: "bab"
Explanation: "aba" is also a valid answer.

Example 2:

Input: s = "cbbd"
Output: "bb"

Constraints:

  • 1 <= s.length <= 1000
  • s consist of only digits and English letters.

 

문제 풀이

 

제일 긴 좌우대칭인 substring 찾으라는 문제임

 

index 넣고 좌우대칭인지 좌랑 우 읽어서 비교하다가 마지막에 slice로 꺼내기로 함

i는 ++

j도 ++

i 부터 j 까지

i - j 비교

i+1 j-1 비교

i + k ≥ j - k 일때

continue;

 

1차시도

class Solution:
    def longestPalindrome(self, s: str) -> str:
        longest = "";
        temp = "";
        i = 0;
        j = 0;
        for i in range(len(s)):
            for j in range(i,len(s)):
                for k in range(j-i):
                    if(s[i+k] != s[j-k]):
                        break;
                    elif((i+k)>=(j-k)):
                        temp = s[i:j+1]
                        if(len(temp)>len(longest)):
                            longest = temp

        return longest;

Input

s =

"babad"

Output

"bab"

Expected

"bab"

Input

s =

"cbbd"

Output

""

Expected

"bb"

 

j-i면 i,j가 1차이날때 2개 비교하게 계획했는데 1개밖에 안 돌아가는 거 같아서

for k in range(j-i+1):

여기 고쳤더니 되긴 되는데 시간초과됨

temp 넣고 읽는걸 줄여봄

class Solution:
    def longestPalindrome(self, s: str) -> str:
        longest = "";
        for i in range(len(s)):
            for j in range(i,len(s)):
                for k in range(j-i+1):
                    if(s[i+k] != s[j-k]):
                        break;
                    elif((i+k)>=(j-k)):
                        if((j-i+1)>len(longest)):
                            longest = s[i:j+1]

        return longest;

Time Limit Exceeded 또 뜸

앞에서부터 하나하나 읽으면서 나가니까 너무 느린거 같아서

i는 앞부터 j는 뒤부터 살피면서 제외하는걸 해보고 싶어짐 ㅎ

지금 있는 longest 보다 j-i가 작아지면 살펴볼 필요도 없으니까 패스하고

j를 뒤부터 살피기로 함 ㅎ

큰 범위부터 봐야 큰게 먼저 걸리니까요

 

최종 답안

class Solution:
    def longestPalindrome(self, s: str) -> str:
        longest = "";
        for i in range(len(s)):
            for j in range(len(s)-1,i-1,-1):
                if(j-i+1<=len(longest)):
                    break;
                for k in range(j-i+1):
                    if(s[i+k] != s[j-k]):
                        break;
                    elif((i+k)>=(j-k)):
                        if((j-i+1)>len(longest)):
                            longest = s[i:j+1]

        return longest;

 

'Coding Test' 카테고리의 다른 글

[프로그래머스][Lv.1]달리기 경주  (0) 2023.10.19
2-2. Add two numbers  (0) 2023.10.14
4. Median of Two Sorted Arrays  (0) 2023.07.20
3.Longest Substring Without Repeating Characters  (0) 2023.07.20
2. Add Two Numbers  (0) 2023.07.20