面試的三個關鍵算法

一、KMP算法

1.定義

str1中是否包含str2,返回初始下標。

2.思路

(1)暴力匹配
基于str1,依次匹配str2,時間復雜度為O(MN)。
(2)KMP算法
基于str2建立一組信息,最大前綴和后綴的匹配。next數組,時間復雜度為O(N)。

3.KPM擴展

(1)給定兩個二叉樹T1和T2,返回T1的某個子樹結構是否與T2的結構相等。
將兩個二叉樹轉換為字符串,再用KMP算法判斷str1是否包含str2。

二、Manacher算法

1.定義

在一個字符串中找到最長的回文子串。
子串(子數組)必須是連續(xù)的,子序列順序不變但可以不連續(xù)。

2.思路

(1)笨辦法
添加特殊字符,例如#(不一定要和原字符串不一樣),從一個數開始向兩邊擴,判斷左右兩個數是否相等。奇回文和偶回文都可以解決。
(2)馬拉車算法

3.擴展

題目:給定一個字符串str1,只能往str1的后面添加字符變成str2,要求str2整體都是回文串且最短。
解題思路:找到包含最后一個字符的回文子串,然后添加不在子串內的字符的逆序。

三、BFPRT算法

1.定義

在一個無序數組中求第k(k≥1)?。ù螅┑臄?,時間復雜度要求為O(N)。

2.思路

(1)隨機快排的partition
看等于的數是否命中第k?。磁袛嘈∮趧澐种档膮^(qū)間數據的個數是否為k-1,而這k-1個數是不需要進行排序的),沒有命中就接著partition,平均時間復雜度為O(N)。
(2)BFPRT算法

  • 關鍵在于劃分值的選擇。
  1. 將數組劃分為每五個數一個組,不足五個的單獨一組,O(1)。
  2. 組內進行排序,組與組之間不排序,O(1)×N/5,即O(N)。
  3. 將每個組的上中位數取出作為新的數組,長度為N/5,數組不一定是有序的。遞歸調用自身,求新數組的中位數,即第N/10小的數,T(N/5)
  4. 將其作為劃分值,對原數組進行partition,O(N)。
  5. 左邊或者右邊數組進行遞歸,最大為T(7N/10)。
    整體時間復雜度為T(N)=T(N/5)+T(7N/10)+O(N),可以證明收斂到O(N)。
  • 為什么要選這個數為劃分值?
    因為它至少可以確定的排除3N/10的數。
  • 為什么要選擇5進行分組?
    因為這個算法是由五個人研究出來的!2333333
    只要能證明收斂到O(N),選擇其他的數也是可以的。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 歸去來兮。 1.1 說明 本篇為《挑戰(zhàn)程序設計競賽(第2版)》[http://www.ituring.com.cn...
    尤汐Yogy閱讀 14,922評論 0 160
  • 1、用C語言實現一個revert函數,它的功能是將輸入的字符串在原串上倒序后返回。 2、用C語言實現函數void ...
    希崽家的小哲閱讀 6,706評論 0 12
  • Free Code Camp的JavaScript算法 翻轉字符串(Reverse a String) 實現:先把...
    有個水友閱讀 491評論 0 0
  • 一個人在 深夜的路上徘徊 迷失了方向 但卻用欲望 拓展了 這個城市的邊緣
    楚云安閱讀 260評論 4 2
  • 年久歲月不曾棄,黯黯深情留初心。 一夕佳期晃似夢,姻緣似定卻無期。
    不落風塵閱讀 241評論 0 0

友情鏈接更多精彩內容