sunday演算法的大致思想是,以pos表示本次匹配的目標串tar的起始位置,len_m表示模式串的長度,當出現不匹配的時候,看從pos開始長為len_m的一段字串的最後乙個字元k是否在模式串中出現過,判斷是否出現過是通過從右到左掃瞄模式串得到的,只要碰到k,記錄下其位置i,將pos+i作為新的pos(pos+=i),繼續匹配。這就扯出了next陣列,不要將這個next陣列跟kmp中的陣列牽連起來,二者沒任何關係。next陣列就是記錄模式串中的字母離串尾的距離,若某個字元重複出現,則只記錄最右邊的那個,next初始值是模式串的長度,即如果某個字元沒在mode串中出現,那麼pos移動時就是整體平移乙個模式串的距離。next[i]表示字母i距離模式串末尾的距離,pos+next[k]表示將目標串的本次起始位置pos移動next[k]個單位,這樣,新的pos位置與k的距離正好是模式串串首到k的距離。因為原來是pos-->pos+len_m,pos右移到pos+next[k]後,那麼距離pos+len_m就是len_m-next[k],正好是模式串串首到k的距離。這種匹配模式思想大體上就是從中間某個字元開始匹配,這樣的好處是增大了匹配成功的概率,極大減少了無用匹配次數(如rat="abcabe",mode="abe",mode與tar的前乙個"ab"的匹配就是無用匹配,因為第三個字元不再匹配),有些情況下比kmp效率高,並且相對容易理解。
給個實現:
既然是字串匹配新秀,就順便說說乙個更容易理解的模式匹配演算法,但論效率個個都是雄於kmp:zzl演算法
相當容易:
整個
程序需要兩部
預處理預處理主要完成查詢模式串首字元在主串中的所有出現位置,並將其儲存在乙個陣列中。
匹配
在預處理的基礎上,字串匹配演算法就可以從查詢到的模式串在主串中的位置開始,匹配模式串首字母之後的其餘部分。此時,採用bf演算法(最聞名而又最笨的字串匹配演算法),並可設定乙個計數器,記錄匹配次數。
實現狠容易,自己看著辦— —p
字串匹配 sunday演算法
原題 lintcode題目 字串查詢 又稱查詢子字串 是字串操作中乙個很有用的函式。你的任務是實現這個函式。對於乙個給定的 source 字串和乙個 target 字串,你應該在 source 字串中找出 target 字串出現的第乙個位置 從0開始 如果不存在,則返回 1。字串匹配最常見的就是km...
字串匹配sunday演算法
在網上看到了一種比kmp和bm演算法還快字串匹配演算法,就看了一下,並且發現一些部落格上寫的 是錯誤的,於是我也寫了乙個,leetcode上測試通過。首先對sunday演算法進行一下講解 從別的地方複製過來的,講的確實不錯 好了,sunday演算法還真的很好理解,用下面的例子來說明吧 j k t h...
字串匹配 Sunday演算法
字串匹配演算法中最先學的演算法是暴力演算法,緊接著是kmp演算法,到現在依舊沒有理解next到底是怎麼求的 尋找到了一種新的演算法 sunday演算法,比kmp演算法更快 匹配時關注匹配主串中參與匹配的最後一位字元的下一位字元。參考 include includeusing namespace st...