Amazon面試題:尋找最長迴文子串

2018-03-12    分類:演算法設計、程式設計開發、首頁精華0人評論發表於2018-03-12

本文由碼農網 – 小峰原創翻譯,轉載請看清文末的轉載要求,歡迎參與我們的付費投稿計劃

這個問題是Amazon在面試中提出來的。

給定一個字串,找到最長的迴文連續子字串。如果不止一個,則返回一個即可。

例如,“aabcdcb”的最長迴文子串是“bcdcb”。 “bananas”的最長迴文子串是“anana”。

解決方案

我們可以用蠻力計算出 O(N^3)中最長的迴文連續子串。遍歷陣列的每個子串並檢查它是否是迴文的。

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

def longest_palindrome(s):
    longest = ''
    for i in range(len(s) - 1):
        for j in range(1, len(s)):
            substring = s[i:j]
            if is_palindrome(substring) and len(substring) > len(longest):
                longest = substring
    return longest

當然,我們也可以通過使用動態程式設計來儲存重複的計算,從而減少執行此演算法所需的時間。讓我們制定一個N乘N的表格A,其中N是輸入字串的長度。然後,在每個索引A[i][j]中存放從s[i:j]構成的子串是否是迴文。我們將使用到以下關係:

  • 所有長度為1的字串都是迴文
  • 如果s[1:-1]是迴文且s的第一個和最後一個字元相同,則s為迴文

所以,當我們填充表格時,我們可以做到以下幾點:

  • 首先,將每個專案沿著對角線’A [i:i]設定為true,因為長度為1的字串總是迴文
  • 然後,檢查A[i:i+1],如果A[i] == A[i + 1]則將其設定為true,否則返回false(檢查所有長度為2的字串)
  • 最後,從上到下,從左到右迭代矩陣,只檢查對角線上部。請注意,ji小是沒有意義的,這就是為什麼我們只需要處理一半矩陣的原因。僅當A[i + 1][j - 1]為真並且A[i] == A[j]時,才將A[i][j]設定為真。
  • 跟蹤我們迄今為止發現的最長的迴文子字串。

我們來看一個“bananas”的例子:

b a n a n a s
b t f f f f f f
a t f t f t f
n t f t f f
a t f f f
n t f f
a t f
s t

def longest_palindrome(s):從表格中可以看到,這裡最長的迴文子串是“anana”,因為A[1:5]是表中顯示為true的最長子串。

    if not s:
        return ''

    longest = s[0]
    A = [[None for _ in range(len(s))] for _ in range(len(s))]

    # Set all substrings of length 1 to be true
    for i in range(len(s)):
        A[i][i] = True

    # Try all substrings of length 2
    for i in range(len(s) - 1):
        A[i][i + 1] = s[i] == s[i + 1]

    i, k = 0, 3
    while k <= len(s):
        while i < (len(s) - k + 1) :
            j = i + k - 1
            A[i][j] = A[i + 1][j - 1] and s[i] == s[j]
            # Update longest if necessary
            if A[i][j] and len(s[i:j + 1]) > len(longest):
                longest = s[i:j + 1]
            i += 1
        k += 1
        i = 0
    return longest

這個時間複雜度和空間複雜度為O(N^2)。

如果你正在準備技術面試,那麼請務必多收集像這樣來自頂尖科技公司的最新面試問題。

祝面試好運!

譯文連結:http://www.codeceo.com/article/amazon-find-longest-palindromic-substring.html
英文原文:Finding the longest palindromic substring
翻譯作者:碼農網 – 小峰
轉載必須在正文中標註並保留原文連結、譯文連結和譯者等資訊。]

相關文章