oracle如何判斷奇數偶數 如何尋找最長回文子串

2021-10-14 08:33:40 字數 2503 閱讀 5854

5.最長回文子串

-----------

回文串是面試常常遇到的問題(雖然問題本身沒啥意義),本文就告訴你回文串問題的核心思想是什麼。

首先,明確一下什:回文串就是正著讀和反著讀都一樣的字串

比如說字串abaabba都是回文串,因為它們對稱,反過來還是和本身一樣。反之,字串abac就不是回文串。

可以看到回文串的的長度可能是奇數,也可能是偶數,這就新增了回文串問題的難度,解決該類問題的核心是雙指標。下面就通過一道最長回文子串的問題來具體理解一下回文串問題:

string longestpalindrome(string s) {}
對於這個問題,我們首先應該思考的是,給乙個字串s,如何在s中找到乙個回文子串?

有乙個很有趣的思路:既然回文串是乙個正著反著讀都一樣的字串,那麼如果我們把s反轉,稱為s',然後在ss'中尋找最長公共子串,這樣應該就能找到最長回文子串。

比如說字串abacd,反過來是dcaba,它的最長公共子串是aba,也就是最長回文子串。

但是這個思路是錯誤的,比如說字串aacxycaa,反轉之後是aacyxcaa,最長公共子串是aac,但是最長回文子串應該是aa

ps:我認真寫了 100 多篇原創,手把手刷 200 道力扣題目,全部發布在 labuladong的演算法小抄,持續更新。建議收藏,按照我的文章順序刷題,掌握各種演算法套路後投再入題海就如魚得水了。

雖然這個思路不正確,但是這種把問題轉化為其他形式的思考方式是非常值得提倡的

下面,就來說一下正確的思路,如何使用雙指標。

尋找回文串的問題核心思想是:從中間開始向兩邊擴散來判斷回文串。對於最長回文子串,就是這個意思:

for 0 <= i < len(s):

找到以 s[i] 為中心的回文串

更新答案

但是呢,我們剛才也說了,回文串的長度可能是奇數也可能是偶數,如果是abba這種情況,沒有乙個中心字元,上面的演算法就沒轍了。所以我們可以修改一下:

for 0 <= i < len(s):

找到以 s[i] 為中心的回文串

找到以 s[i] 和 s[i+1] 為中心的回文串

更新答案

ps:讀者可能發現這裡的索引會越界,等會會處理。

按照上面的思路,先要實現乙個函式來尋找最長回文串,這個函式是有點技巧的:

string palindrome(string& s, int l, int r) 

// 返回以 s[l] 和 s[r] 為中心的最長回文串

return s.substr(l + 1, r - l - 1);

}

為什麼要傳入兩個指標lr呢?因為這樣實現可以同時處理回文串長度為奇數和偶數的情況

for 0 <= i < len(s):

# 找到以 s[i] 為中心的回文串

palindrome(s, i, i)

# 找到以 s[i] 和 s[i+1] 為中心的回文串

palindrome(s, i, i + 1)

更新答案

下面看下longestpalindrome的完整**:

string longestpalindrome(string s) 

return res;

}

至此,這道最長回文子串的問題就解決了,時間複雜度 o(n^2),空間複雜度 o(1)。

ps:我認真寫了 100 多篇原創,手把手刷 200 道力扣題目,全部發布在 labuladong的演算法小抄,持續更新。建議收藏,按照我的文章順序刷題,掌握各種演算法套路後投再入題海就如魚得水了。

值得一提的是,這個問題可以用動態規劃方法解決,時間複雜度一樣,但是空間複雜度至少要 o(n^2) 來儲存 dp table。這道題是少有的動態規劃非最優解法的問題。

另外,這個問題還有乙個巧妙的解法,時間複雜度只需要 o(n),不過該解法比較複雜,我個人認為沒必要掌握。該演算法的名字叫 manacher's algorithm(馬拉車演算法),有興趣的讀者可以自行搜尋一下。

_____________

oracle如何判斷奇數偶數 如何尋找最長回文子串

讀完本文,你可以去力扣拿下如下題目 5.最長回文子串 回文串是面試常常遇到的問題 雖然問題本身沒啥意義 本文就告訴你回文串問題的核心思想是什麼。首先,明確一下什 回文串就是正著讀和反著讀都一樣的字串。比如說字串 aba 和 abba 都是回文串,因為它們對稱,反過來還是和本身一樣。反之,字串 aba...

判斷奇數還是偶數

判斷奇數還是偶數 建立乙個函式,它以整數作為引數,對偶數返回 偶數 對奇數返回 奇數 解法一 判斷奇數還是偶數 def even or odd number if number 2 0 return even else return odd assert even or odd 2 even ass...

python判斷奇數偶數

num eval input 請輸入乙個數 if num 2 0 print 是個偶數 format num else print d是個奇數 num 如果輸入有錯,跳過判斷重新輸入 如果輸入正確,判斷一次之後跳出迴圈 while true try num int input 請輸入乙個數 exce...