>백엔드 개발 >파이썬 튜토리얼 >코딩 과제: 문제 해결을 통해 참여하고 학습

코딩 과제: 문제 해결을 통해 참여하고 학습

DDD
DDD원래의
2024-10-01 12:12:03467검색

Coding Challenges: Engage and Learn Through Problem Solving

코딩 과제: 문제 해결을 통해 참여하고 학습

코딩 챌린지는 프로그래밍 기술을 향상하고, 커뮤니티에 참여하고, 새로운 기술을 배울 수 있는 환상적인 방법입니다. 이 블로그 게시물에서는 코딩 문제를 제시하고 이를 해결하기 위한 다양한 접근 방식에 대해 논의하며 독자들이 댓글로 솔루션을 공유하도록 초대할 것입니다. 뛰어들어 보세요!

과제: 가장 긴 회문 부분 문자열 찾기

문제:
문자열 s가 주어지면 s에서 가장 긴 회문 부분 문자열을 찾습니다. 회문은 뒤에서 읽어도 앞으로 읽어도 같은 문자열입니다.

예:

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

제약조건:

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

다양한 프로그래밍 언어를 사용하여 창의적인 접근 방식으로 솔루션을 공유해 주세요.

문제 해결을 위한 단계별 가이드

1단계: 문제 이해

코드를 시작하기 전에 문제를 이해했는지 확인하세요. 회문 부분 문자열은 앞으로 읽어도 뒤로 읽어도 같은 문자 시퀀스입니다. 우리의 목표는 주어진 문자열 s에서 가장 긴 부분 문자열을 찾는 것입니다.

2단계: 접근 방식 계획

이 문제를 해결하는 방법에는 여러 가지가 있습니다. 세 가지 접근 방식에 대해 논의하겠습니다.

  1. 무차별 대입
  2. 센터 주변으로 확장
  3. 동적 프로그래밍

3단계: 무차별 접근 방식 구현

무차별 접근 방식에는 가능한 모든 하위 문자열을 검사하고 그것이 회문인지 확인하는 작업이 포함됩니다. 이 방법은 간단하지만 큰 문자열에는 효율적이지 않습니다.

def longest_palindrome_brute_force(s):
    def is_palindrome(sub):
        return sub == sub[::-1]

    n = len(s)
    longest = ""
    for i in range(n):
        for j in range(i, n):
            if is_palindrome(s[i:j+1]) and len(s[i:j+1]) > len(longest):
                longest = s[i:j+1]
    return longest


print(longest_palindrome_brute_force("babad"))  # Output: "bab" or "aba"




<h4>
  
  
  4단계: 중심 중심 접근 방식 구현
</h4>

<p>이 접근 방식에는 가장 긴 회문을 찾기 위해 각 문자 주변(및 문자 간)을 확장하는 작업이 포함됩니다. 무차별 대입보다 더 효율적입니다.<br>
</p>

<pre class="brush:php;toolbar:false">def longest_palindrome_expand_center(s):
    def expand_around_center(left, right):
        while left >= 0 and right < len(s) and s[left] == s[right]:
            left -= 1
            right += 1
        return s[left+1:right]

    longest = ""
    for i in range(len(s)):
        # Odd length palindromes
        odd_palindrome = expand_around_center(i, i)
        if len(odd_palindrome) > len(longest):
            longest = odd_palindrome
        # Even length palindromes
        even_palindrome = expand_around_center(i, i+1)
        if len(even_palindrome) > len(longest):
            longest = even_palindrome
    return longest


print(longest_palindrome_expand_center("babad"))  # Output: "bab" or "aba"

5단계: 동적 프로그래밍 접근 방식 구현

동적 프로그래밍 접근 방식은 테이블을 사용하여 하위 문자열이 회문인지 여부를 저장하여 효율적인 솔루션을 제공합니다.

def longest_palindrome_dp(s):
    n = len(s)
    if n == 0:
        return ""
    dp = [[False] * n for _ in range(n)]
    start, max_length = 0, 1

    for i in range(n):
        dp[i][i] = True

    for length in range(2, n+1):
        for i in range(n-length+1):
            j = i + length - 1
            if s[i] == s[j]:
                if length == 2 or dp[i+1][j-1]:
                    dp[i][j] = True
                    if length > max_length:
                        start = i
                        max_length = length

    return s[start:start+max_length]


print(longest_palindrome_dp("babad"))  # Output: "bab" or "aba"

알고리즘을 최적화해 보세요.

위 내용은 코딩 과제: 문제 해결을 통해 참여하고 학습의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.