Amazon面試題:尋找最長迴文子串
本文由碼農網 – 小峰原創翻譯,轉載請看清文末的轉載要求,歡迎參與我們的付費投稿計劃!
這個問題是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的字串) - 最後,從上到下,從左到右迭代矩陣,只檢查對角線上部。請注意,
j
比i
小是沒有意義的,這就是為什麼我們只需要處理一半矩陣的原因。僅當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
翻譯作者:碼農網 – 小峰
[ 轉載必須在正文中標註並保留原文連結、譯文連結和譯者等資訊。]
相關文章
- 今日面試題:最長迴文子串;及迴文分割分析面試題
- java 最長迴文子串Java
- 演算法-兩最長迴文子串演算法
- LEECODE 5 求最長迴文子串
- [動態規劃] 六、最長迴文子串動態規劃
- LeetCode 5.最長迴文子串LeetCode
- 演算法之字串——最長迴文子串演算法字串
- 每天一道演算法題:最長迴文子串演算法
- Leetcode[字串] 5. 最長迴文子串LeetCode字串
- LeetCode-5. 最長迴文子串(Manacher)LeetCode
- 翻譯數字串;及最長迴文子串分析字串
- leedcode-最長迴文串
- 最長迴文子串 V2(Manacher演算法)演算法
- HDU 3068 最長迴文(Manacher演算法解決最長迴文串問題)演算法
- 最長迴文子串(百度筆試題和hdu 3068)筆試
- 程式碼隨想錄day46 || 647 迴文子串, 516 最長迴文子序列
- 每日一道 LeetCode (48):最長迴文子串LeetCode
- [LeetCode] Longest Palindromic Substring 最長迴文子串LeetCode
- ural 1297 最長迴文子串 字尾陣列陣列
- 最長子串
- LeetCode - 409 - 最長迴文串LeetCode
- lc1771 由子序列構造的最長迴文串的長度
- Leetcode5: Longest Palindromic Substring(最長迴文子串)LeetCode
- hdu5371 最長迴文子串變形(Manacher演算法)演算法
- 微軟演算法面試題:如何找最長的增長子序列微軟演算法面試題
- hihocoder 1032 最長迴文子串 (Manacher演算法 詳解+模板)演算法
- 程式碼隨想錄演算法訓練營 | 647. 迴文子串,516.最長迴文子序列演算法
- lCS(最長公共子串)
- L2-008 最長對稱子串【最長迴文字串】字串
- (迴文串)leetcode各種迴文串問題LeetCode
- 程式碼隨想錄演算法訓練營day46| 647. 迴文子串 516.最長迴文子序列演算法
- 【谷歌面試題】找出字串中只包含兩種字元的最長子串谷歌面試題字串字元
- 程式碼隨想錄演算法訓練營第五十七/天 | 516. 最長迴文子序列,647. 迴文子串演算法
- 線性dp:最長公共子串
- 【每日一題】無重複字元的最長子串每日一題字元
- leetcode 解題 5. 最長迴文子串 python@ 官解,暴力法,動態法,manacher 法LeetCodePython
- LeetCode516. 最長迴文子序列LeetCode
- 牛客題霸 [最長公共子串]C++題解/答案C++