๋ฆฌํŠธ์ฝ”๋“œ LeetCode 5 Longest Palindromic Substring ๋ฌธ์ œ์˜ ํŒŒ์ด์ฌ python ํ’€์ด์ž…๋‹ˆ๋‹ค.

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



๋ฌธ์ œ

Given a stringย s, returnย the longestย palindromicย substringย inย s.


Constraints

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




ํ’€์ด

ํˆฌ ํฌ์ธํŠธ๋ฅผ ํ™œ์šฉํ•œ ์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์šฐ ๋ฐฉ์‹์œผ๋กœ ํ’€์–ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

ํ™•์žฅ ํ•จ์ˆ˜ ์„ ์–ธ

# ํˆฌ ํฌ์ธํ„ฐ ํ™•์žฅ ํ•จ์ˆ˜ ์„ ์–ธ
ย  ย  ย  ย  def expand(left: int, right: int) -> str:
ย  ย  ย  ย  ย  ย  while left >= 0 and right < len(s) and s[left] == s[right]:
ย  ย  ย  ย  ย  ย  ย  ย  left -= 1
ย  ย  ย  ย  ย  ย  ย  ย  right += 1
 
ย  ย  ย  ย  ย  ย  return s[left + 1 : right]
ย  ย  

์ฃผ์–ด์ง„ left์™€ right๋ฅผ ๊ธฐ์ค€์œผ๋กœ, ํŒฐ๋ฆฐ๋“œ๋กฌ์ธ์ง€ ํ™•์ธํ•˜๋ฉฐ ์–‘์ชฝ์œผ๋กœ ํ™•์žฅํ•ด ๋‚˜๊ฐ€๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.

  • ์˜ˆ์‹œ
    • โ€˜abbaโ€™์—์„œ left=1, right=2์ด๋ฉด โ†’ โ€œbbโ€์—์„œ โ€œabbaโ€๊นŒ์ง€ ํ™•์žฅ ๊ฐ€๋Šฅ
  • left + 1 : right๋ฅผ ๋ฆฌํ„ดํ•˜๋Š” ์ด์œ 
    • while ๋ฃจํ”„๊ฐ€ ๋๋‚  ๋•Œ๋Š” ํ•œ ๋ฒˆ ๋” ์ดˆ๊ณผํ•œ ์ƒํƒœ๋ผ, ์˜ฌ๋ฐ”๋ฅธ ๊ตฌ๊ฐ„์„ ์ž˜๋ผ์•ผ ํ•จ
# ์˜ˆ์‹œ
s = "racecar"
expand(3, 3) โ†’ "racecar"  โ† ๊ฐ€์šด๋ฐ๊ฐ€ 'e'์ธ ํ™€์ˆ˜ ํŒฐ๋ฆฐ๋“œ๋กฌ
expand(2, 3) โ†’ "cec"      โ† ๊ฐ€์šด๋ฐ๊ฐ€ 'ce'์ธ ์ง์ˆ˜ ํŒฐ๋ฆฐ๋“œ๋กฌ

์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์šฐ

result = ''
for i in range(0, len(s) - 1):
    result = max(result, expand(i, i+1), expand(i, i+2), key=len)
 
  • ๊ฐ ๋ฌธ์ž ์œ„์น˜ i๋ฅผ ๊ธฐ์ค€์œผ๋กœ
    • expand(i, i+1) โ†’ ์ง์ˆ˜ ๊ธธ์ด ํŒฐ๋ฆฐ๋“œ๋กฌ ์‹œ๋„ (ex: "abba")
    • expand(i, i+2) โ†’ ํ™€์ˆ˜ ๊ธธ์ด ํŒฐ๋ฆฐ๋“œ๋กฌ ์‹œ๋„ (ex: "racecar")
      • ํ™€์ˆ˜ ๊ธธ์ด ํŒฐ๋ฆฐ๋“œ๋กฌ ์กฐ์‚ฌ๋Š” expand(i, i)๋กœ ์‹œ์ž‘ํ•  ์ˆ˜๋„ ์žˆ์Œ. ํ•˜์ง€๋งŒ ์–ด์ฐจํ”ผ ํ•œ ๊ธ€์ž ๋ฌธ์ž์—ด์ด๊ธฐ ๋•Œ๋ฌธ์—, ์„ธ ๊ธ€์ž ๋ฌธ์ž์—ด๋ถ€ํ„ฐ ์กฐ์‚ฌ๋ฅผ ํ•˜๋Š” ๊ฒƒ์ด ํšจ์œจ์ 
  • max(..., key=len) โ†’ ์„ธ ํ›„๋ณด ์ค‘์—์„œ ๊ฐ€์žฅ ๊ธด ํŒฐ๋ฆฐ๋“œ๋กฌ ๋ฌธ์ž์—ด์„ ์„ ํƒํ•ด์„œ result์— ์ €์žฅ

์™œ i+1, i+2๋ฅผ ์“ธ๊นŒ?

  • ํŒฐ๋ฆฐ๋“œ๋กฌ์€ ์ค‘์‹ฌ์„ ๊ธฐ์ค€์œผ๋กœ ์ขŒ์šฐ ๋Œ€์นญ์ด๊ธฐ ๋•Œ๋ฌธ์—,
    • ์ค‘์‹ฌ์ด ํ•˜๋‚˜์ผ ์ˆ˜๋„ ์žˆ๊ณ  (expand(i, i+2) โ†’ ํ™€์ˆ˜)
    • ์ค‘์‹ฌ์ด ๋‘ ๊ฐœ์ผ ์ˆ˜๋„ ์žˆ์Œ (expand(i, i+1) โ†’ ์ง์ˆ˜)

๊ทธ๋ž˜์„œ ๋‘˜ ๋‹ค ์‹œ๋„ํ•ด ๋ณด๊ณ , ๋” ๊ธด ์ชฝ์„ ์„ ํƒ

  • max(...)๋กœ ํ˜„์žฌ result๋ณด๋‹ค ๋” ๊ธด ํŒฐ๋ฆฐ๋“œ๋กฌ์ด ๋‚˜์˜ค๋ฉด ์—…๋ฐ์ดํŠธํ•จ

for i in range(0, len(s) - 1) ๋ฃจํ”„ ๊ณผ์ •

for i in range(0, len(s) - 1)
โ†’ ๊ฐ ์œ„์น˜์—์„œ expand(i, i+1) (์ง์ˆ˜) ์™€ expand(i, i+2) (ํ™€์ˆ˜) ์ˆ˜ํ–‰

๐Ÿ”น i = 0

  • expand(0, 1) โ†’ b โ‰  a โ†’ ํŒฐ๋ฆฐ๋“œ๋กฌ X โ†’ return ""
  • expand(0, 2) โ†’ b == b, ๊ทธ๋‹ค์Œ a == a โ†’ ํŒฐ๋ฆฐ๋“œ๋กฌ "bab"
    โ†’ ํ˜„์žฌ result: "bab"

๐Ÿ”น i = 1

  • expand(1, 2) โ†’ a โ‰  b โ†’ return ""
  • expand(1, 3) โ†’ a == a, ๊ทธ๋‹ค์Œ b == b โ†’ ํŒฐ๋ฆฐ๋“œ๋กฌ "aba"
    โ†’ ๊ธธ์ด ๊ฐ™์Œ. "bab" ๋˜๋Š” "aba" ์ค‘ ํ•˜๋‚˜ ์œ ์ง€

๐Ÿ”น i = 2

  • expand(2, 3) โ†’ b โ‰  a โ†’ return ""
  • expand(2, 4) โ†’ b โ‰  d โ†’ return ""

๐Ÿ”น i = 3

  • expand(3, 4) โ†’ a โ‰  d โ†’ return ""
  • expand(3, 5) โ†’ ๋ฒ”์œ„ ๋ฒ—์–ด๋‚จ โ†’ return ""

์ •๋‹ต ์ฝ”๋“œ

# ๊ฐ€์žฅ ๊ธด ํŽ ๋ฆฐ๋“œ๋กฌ ์ˆ˜ : ํˆฌ ํฌ์ธํŠธ, ์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์šฐ ๋ฐฉ์‹ ์‘์šฉ
 
class Solution:
ย  ย  def longestPalindrome(self, s: str) -> str:
 
ย  ย  ย  ย  # ํˆฌ ํฌ์ธํ„ฐ ํ™•์žฅ ํ•จ์ˆ˜ ์„ ์–ธ
ย  ย  ย  ย  def expand(left: int, right: int) -> str:
ย  ย  ย  ย  ย  ย  while left >= 0 and right < len(s) and s[left] == s[right]:
ย  ย  ย  ย  ย  ย  ย  ย  left -= 1
ย  ย  ย  ย  ย  ย  ย  ย  right += 1
 
ย  ย  ย  ย  ย  ย  return s[left + 1 : right]
 
ย  ย  ย  ย  # ๊ธธ์ด๊ฐ€ 1 ์ดํ•˜๊ฑฐ๋‚˜, ๋’ค์ง‘์–ด๋„ ๋˜‘๊ฐ™์€ ๊ทธ ์ž์ฒด๋กœ ํŽ ๋ฆฐ๋“œ๋กฌ์ธ ๊ฒฝ์šฐ
ย  ย  ย  ย  if len(s) < 2 or s == s[::-1]:
ย  ย  ย  ย  ย  ย  return s
 
ย  ย  ย  ย  result = ''
ย  ย  ย  ย  
ย  ย  ย  ย  # ์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์šฐ ์šฐ์ธก ์ด๋™
ย  ย  ย  ย  for i in range(0, len(s)-1):
ย  ย  ย  ย  ย  ย  result = max(result, expand(i, i+1), expand(i, i+2), key=len)
 
ย  ย  ย  ย  return result