1 回文識別基礎
回文通俗地將就是把一個句子或者字符串正過來反過來讀都是一樣的.
比如123321就是一個回文.
識別一個回文字符串思路也很簡單:定義兩個指針分別指向字符串的頭尾,若果兩個指針指向的字符相等,那么繼續逐漸向中間收縮,否則退出循環.
知道指針相遇.如果指針相遇之前就已經停止那么就不是回文
2 回文串的加強版
原題
3 回文數字
原題
解:
時間O(n)空間O(1)其中x/t%10表示每次循環數字的首位,比如1234的首位計算為:1234除以1000等等于1,在對10 取余,結果為1。下一次循環首位為1234/100%10結果為2,一次類推,而最末尾則為直接對10 取余,末尾向左以為則為1234/10再對10 取余,基本原理是這樣。
4 最長回文字串
- 暴力求解法
窮舉思路:取出所有的子串,判斷它是否回文,并返回最長的子串
- 中心擴展法
思路從字符串中的某個元素開始(逐個判斷),向兩邊擴展,判斷是否回文并記錄,將取得最長子回文返回即可。
- 動態規劃法簡介
- Manacher算法簡介
5. leetCode 234:Palindrome Linked List(回文鏈表)
按照以往的經驗,關于回文問題不外乎兩種:中心擴展法,兩端收縮法
然而單鏈表無法倒序遍歷,兩種方法都沒有什么卵用。
仔細觀察一個回文比如:1 2 3 4 5 5 4 3 2 1發現有什么規律?假象把這個鏈表對折,那么相應的每個對稱的數字都對的上(這不廢話~),其實這個對折過程就是先把鏈表的一半(前一半后一半都行)反轉然后在匹配的過程,如果是回文當然能一一對應上啦
實現代碼:
有時候面試官會要求不要破壞鏈表結構
那么可以把鏈表的一半用棧保存起來,然后再比較。
或者還是用之前的方法,翻轉之后再給翻轉回去~~