[LeetCode] 0005. 가장 긴 팰린드롬 부분 문자열

Python, C++, JavaScript, SQL 및 TypeScript의 다양한 LeetCode 솔루션을 살펴보세요. 여러 프로그래밍 언어로 인터뷰 준비, 학습 및 코드 연습에 적합합니다. Github 레포 링크

문자열이 주어지면 에스, 반품 가장 긴 회문적 하위 문자열 ~에 에스.

 

예시 1:

입력: s = "바바드"
산출: "바브"
설명: "aba"도 유효한 답변입니다.

예 2:

입력: s = "씨비디"
산출: "비비"

 

제약:

  • 1 <= s.length <= 1000
  • 에스 숫자와 영어 문자로만 구성됩니다.

파이썬

				
					# 시간 복잡도: O(n) # 공간 복잡도: O(n) # 관리자 알고리즘 클래스 솔루션: def largestPalindrome(self, s: str) -> str: sPrime = "#" + "#".join(s) + "#" n = len(sPrime) palindromeRadii = [0] * n center = radius = 0 for i in range(n): mirror = 2 * center - i if i < radius: palindromeRadii[i] = min(radius - i, palindromeRadii[mirror]) while ( i + 1 + palindromeRadii[i] < n and i - 1 - palindromeRadii[i] >= 0 and sPrime[i + 1 + palindromeRadii[i]] == sPrime[i - 1 - palindromeRadii[i]] ): palindromeRadii[i] += 1 if i + palindromeRadii[i] > 반경: center = i 반경 = i + palindromeRadii[i] maxLength = max(palindromeRadii) centerIndex = palindromeRadii.index(maxLength) startIndex = (centerIndex - maxLength) // 2 largestPalindrome = s[startIndex: startIndex + maxLength] return largestPalindrome # 무차별 대입 # 시간 복잡도: O(n^3) # 공간 복잡도: O(n^3) 클래스 솔루션: def largestPalindrome(self, s: str) -> str: def check(i, j): left = i right = j - 1 while left < right: if s[left] != s[right]: return False left += 1 right -= 1 return True for length in range(len(s), 0, -1): for start in range(len(s) - length + 1): if check(start, start + length): return s[start: start + length] return "" # 시간 복잡도: O(n^2) # 공간 복잡도: O(n^2) # 동적 프로그래밍 클래스 솔루션: def largestPalindrome(self, s: str) -> str: n = len(s) dp = [[False] * n for _ in range(n)] ans = [0, 0] for i in range(n): dp[i][i] = True for i in range(n-1): if s[i] == s[i+1]: dp[i][i+1] = True ans = [i, i+1] for diff in range(2, n): for i in range(n - diff): j = i + diff if s[i] == s[j] 그리고 dp[i+1][j-1]: dp[i][j] = True ans = [i, j] i, j = ans return s[i:j+1] s = "babad" print(Solution().longestPalindrome(s)) s = "cbbd" print(Solution().longestPalindrome(s))
				
			
ko_KR한국어