Coding Challenges: Engage and Learn Through Problem Solving

Coding Challenges: Engage and Learn Through Problem Solving

Coding challenges are a fantastic way to improve your programming skills, engage with a community, and learn new techniques. In this blog post, we’ll present a coding challenge, discuss various approaches to solve it, and invite readers to share their solutions in the comments. Let’s dive in!

Challenge: Find the Longest Palindromic Substring

Problem:
Given a string s, find the longest palindromic substring in s. A palindrome is a string that reads the same backward as forward.

Example:

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

Enter fullscreen mode Exit fullscreen mode

Constraints:

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

Please share your Solutions with creative approaches using different programming languages.

Step-by-Step Guide to Solve the Challenge

Step 1: Understand the Problem

Before jumping into the code, make sure you understand the problem. A palindromic substring is a sequence of characters that reads the same backward as forward. Our goal is to find the longest such substring in the given string s.

Step 2: Plan Your Approach

There are several ways to solve this problem. We’ll discuss three approaches:

  1. Brute Force
  2. Expand Around Center
  3. Dynamic Programming

Step 3: Implement the Brute Force Approach

The brute force approach involves checking all possible substrings and determining if they are palindromes. This method is straightforward but not efficient for large strings.

<span>def</span> <span>longest_palindrome_brute_force</span><span>(</span><span>s</span><span>):</span>
<span>def</span> <span>is_palindrome</span><span>(</span><span>sub</span><span>):</span>
<span>return</span> <span>sub</span> <span>==</span> <span>sub</span><span>[::</span><span>-</span><span>1</span><span>]</span>
<span>n</span> <span>=</span> <span>len</span><span>(</span><span>s</span><span>)</span>
<span>longest</span> <span>=</span> <span>""</span>
<span>for</span> <span>i</span> <span>in</span> <span>range</span><span>(</span><span>n</span><span>):</span>
<span>for</span> <span>j</span> <span>in</span> <span>range</span><span>(</span><span>i</span><span>,</span> <span>n</span><span>):</span>
<span>if</span> <span>is_palindrome</span><span>(</span><span>s</span><span>[</span><span>i</span><span>:</span><span>j</span><span>+</span><span>1</span><span>])</span> <span>and</span> <span>len</span><span>(</span><span>s</span><span>[</span><span>i</span><span>:</span><span>j</span><span>+</span><span>1</span><span>])</span> <span>></span> <span>len</span><span>(</span><span>longest</span><span>):</span>
<span>longest</span> <span>=</span> <span>s</span><span>[</span><span>i</span><span>:</span><span>j</span><span>+</span><span>1</span><span>]</span>
<span>return</span> <span>longest</span>
<span>print</span><span>(</span><span>longest_palindrome_brute_force</span><span>(</span><span>"</span><span>babad</span><span>"</span><span>))</span> <span># Output: "bab" or "aba" </span>
<span>def</span> <span>longest_palindrome_brute_force</span><span>(</span><span>s</span><span>):</span>
    <span>def</span> <span>is_palindrome</span><span>(</span><span>sub</span><span>):</span>
        <span>return</span> <span>sub</span> <span>==</span> <span>sub</span><span>[::</span><span>-</span><span>1</span><span>]</span>

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


<span>print</span><span>(</span><span>longest_palindrome_brute_force</span><span>(</span><span>"</span><span>babad</span><span>"</span><span>))</span>  <span># Output: "bab" or "aba" </span>
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"

Enter fullscreen mode Exit fullscreen mode

Step 4: Implement the Expand Around Center Approach

This approach involves expanding around each character (and between characters) to find the longest palindrome. It’s more efficient than brute force.

<span>def</span> <span>longest_palindrome_expand_center</span><span>(</span><span>s</span><span>):</span>
<span>def</span> <span>expand_around_center</span><span>(</span><span>left</span><span>,</span> <span>right</span><span>):</span>
<span>while</span> <span>left</span> <span>>=</span> <span>0</span> <span>and</span> <span>right</span> <span><</span> <span>len</span><span>(</span><span>s</span><span>)</span> <span>and</span> <span>s</span><span>[</span><span>left</span><span>]</span> <span>==</span> <span>s</span><span>[</span><span>right</span><span>]:</span>
<span>left</span> <span>-=</span> <span>1</span>
<span>right</span> <span>+=</span> <span>1</span>
<span>return</span> <span>s</span><span>[</span><span>left</span><span>+</span><span>1</span><span>:</span><span>right</span><span>]</span>
<span>longest</span> <span>=</span> <span>""</span>
<span>for</span> <span>i</span> <span>in</span> <span>range</span><span>(</span><span>len</span><span>(</span><span>s</span><span>)):</span>
<span># Odd length palindromes </span> <span>odd_palindrome</span> <span>=</span> <span>expand_around_center</span><span>(</span><span>i</span><span>,</span> <span>i</span><span>)</span>
<span>if</span> <span>len</span><span>(</span><span>odd_palindrome</span><span>)</span> <span>></span> <span>len</span><span>(</span><span>longest</span><span>):</span>
<span>longest</span> <span>=</span> <span>odd_palindrome</span>
<span># Even length palindromes </span> <span>even_palindrome</span> <span>=</span> <span>expand_around_center</span><span>(</span><span>i</span><span>,</span> <span>i</span><span>+</span><span>1</span><span>)</span>
<span>if</span> <span>len</span><span>(</span><span>even_palindrome</span><span>)</span> <span>></span> <span>len</span><span>(</span><span>longest</span><span>):</span>
<span>longest</span> <span>=</span> <span>even_palindrome</span>
<span>return</span> <span>longest</span>
<span>print</span><span>(</span><span>longest_palindrome_expand_center</span><span>(</span><span>"</span><span>babad</span><span>"</span><span>))</span> <span># Output: "bab" or "aba" </span>
<span>def</span> <span>longest_palindrome_expand_center</span><span>(</span><span>s</span><span>):</span>
    <span>def</span> <span>expand_around_center</span><span>(</span><span>left</span><span>,</span> <span>right</span><span>):</span>
        <span>while</span> <span>left</span> <span>>=</span> <span>0</span> <span>and</span> <span>right</span> <span><</span> <span>len</span><span>(</span><span>s</span><span>)</span> <span>and</span> <span>s</span><span>[</span><span>left</span><span>]</span> <span>==</span> <span>s</span><span>[</span><span>right</span><span>]:</span>
            <span>left</span> <span>-=</span> <span>1</span>
            <span>right</span> <span>+=</span> <span>1</span>
        <span>return</span> <span>s</span><span>[</span><span>left</span><span>+</span><span>1</span><span>:</span><span>right</span><span>]</span>

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


<span>print</span><span>(</span><span>longest_palindrome_expand_center</span><span>(</span><span>"</span><span>babad</span><span>"</span><span>))</span>  <span># Output: "bab" or "aba" </span>
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"

Enter fullscreen mode Exit fullscreen mode

Step 5: Implement the Dynamic Programming Approach

The dynamic programming approach uses a table to store whether a substring is a palindrome, leading to an efficient solution.

<span>def</span> <span>longest_palindrome_dp</span><span>(</span><span>s</span><span>):</span>
<span>n</span> <span>=</span> <span>len</span><span>(</span><span>s</span><span>)</span>
<span>if</span> <span>n</span> <span>==</span> <span>0</span><span>:</span>
<span>return</span> <span>""</span>
<span>dp</span> <span>=</span> <span>[[</span><span>False</span><span>]</span> <span>*</span> <span>n</span> <span>for</span> <span>_</span> <span>in</span> <span>range</span><span>(</span><span>n</span><span>)]</span>
<span>start</span><span>,</span> <span>max_length</span> <span>=</span> <span>0</span><span>,</span> <span>1</span>
<span>for</span> <span>i</span> <span>in</span> <span>range</span><span>(</span><span>n</span><span>):</span>
<span>dp</span><span>[</span><span>i</span><span>][</span><span>i</span><span>]</span> <span>=</span> <span>True</span>
<span>for</span> <span>length</span> <span>in</span> <span>range</span><span>(</span><span>2</span><span>,</span> <span>n</span><span>+</span><span>1</span><span>):</span>
<span>for</span> <span>i</span> <span>in</span> <span>range</span><span>(</span><span>n</span><span>-</span><span>length</span><span>+</span><span>1</span><span>):</span>
<span>j</span> <span>=</span> <span>i</span> <span>+</span> <span>length</span> <span>-</span> <span>1</span>
<span>if</span> <span>s</span><span>[</span><span>i</span><span>]</span> <span>==</span> <span>s</span><span>[</span><span>j</span><span>]:</span>
<span>if</span> <span>length</span> <span>==</span> <span>2</span> <span>or</span> <span>dp</span><span>[</span><span>i</span><span>+</span><span>1</span><span>][</span><span>j</span><span>-</span><span>1</span><span>]:</span>
<span>dp</span><span>[</span><span>i</span><span>][</span><span>j</span><span>]</span> <span>=</span> <span>True</span>
<span>if</span> <span>length</span> <span>></span> <span>max_length</span><span>:</span>
<span>start</span> <span>=</span> <span>i</span>
<span>max_length</span> <span>=</span> <span>length</span>
<span>return</span> <span>s</span><span>[</span><span>start</span><span>:</span><span>start</span><span>+</span><span>max_length</span><span>]</span>
<span>print</span><span>(</span><span>longest_palindrome_dp</span><span>(</span><span>"</span><span>babad</span><span>"</span><span>))</span> <span># Output: "bab" or "aba" </span>
<span>def</span> <span>longest_palindrome_dp</span><span>(</span><span>s</span><span>):</span>
    <span>n</span> <span>=</span> <span>len</span><span>(</span><span>s</span><span>)</span>
    <span>if</span> <span>n</span> <span>==</span> <span>0</span><span>:</span>
        <span>return</span> <span>""</span>
    <span>dp</span> <span>=</span> <span>[[</span><span>False</span><span>]</span> <span>*</span> <span>n</span> <span>for</span> <span>_</span> <span>in</span> <span>range</span><span>(</span><span>n</span><span>)]</span>
    <span>start</span><span>,</span> <span>max_length</span> <span>=</span> <span>0</span><span>,</span> <span>1</span>

    <span>for</span> <span>i</span> <span>in</span> <span>range</span><span>(</span><span>n</span><span>):</span>
        <span>dp</span><span>[</span><span>i</span><span>][</span><span>i</span><span>]</span> <span>=</span> <span>True</span>

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

    <span>return</span> <span>s</span><span>[</span><span>start</span><span>:</span><span>start</span><span>+</span><span>max_length</span><span>]</span>


<span>print</span><span>(</span><span>longest_palindrome_dp</span><span>(</span><span>"</span><span>babad</span><span>"</span><span>))</span>  <span># Output: "bab" or "aba" </span>
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"

Enter fullscreen mode Exit fullscreen mode

Try optimizing the algorithms.

原文链接:Coding Challenges: Engage and Learn Through Problem Solving

© 版权声明
THE END
喜欢就支持一下吧
点赞10 分享
The future you will certainly thank yourself now desperately.
未来的你一定会感谢现在拼命的自己
评论 抢沙发

请登录后发表评论

    暂无评论内容