聽說比KMP更牛逼的字符串匹配算法-Sunday

廢話

今天之前,我只知道KMP(看貓片)算法,昨天剛看了28. 實現 strStr(),今天早上剛剛從一個KMP算法的評論裏面知道了還有這個Sunday算法,作爲一個程序員,我最喜歡週末了。

字符串匹配算法通常包含BF、KMP、BM、Sunday。

  • BF是最簡單暴力的算法

  • KMP是最廣爲人知的算法

  • BM效率高,複雜

  • Sunday簡單且高效

正文

Sunday算法的最主要特點就是思路簡單,不像KMP。
圖1,別處CV的圖片,如有侵權,請留言告知
如圖,在匹配不上的時候,直接比較“主串”此次匹配結束位置的後一位是否在“模式串”中

  • 不在(圖中i不在模式串中),則主串中比對的起點(圖中的起點是s)向後移動模式串的長度+1(s->6+1=n);
    圖2,別處CV的圖片,如有侵權,請留言告知
    比較n,又不等,又如上看結束後的後一位(r):
  • (r在模式串中),則主串起點向後移動"模式串長度-字符在模式串中最後一次出現的下標"(從n->(6-3)=s)
    圖3,別處CV的圖片,如有侵權,請留言告知
    繼續比對,匹配長度等於模式串長度,匹配成功,返回當前起點。

代碼

/**
 * 學習sunday算法
 */
fun strStr(haystack: String, needle: String): Int {
    if(needle.isEmpty())
        return 0
    val len1=haystack.length
    val len2=needle.length

    if(len2>len1)
        return -1

    //build the last map
    val map= mutableMapOf<Char,Int>()
    needle.forEachIndexed { index, c ->
        map[c] = index
    }
    var start=0 //current start in haystack
    var compareCount=0
    while(start+len2<=len1){
        compareCount=0
        while(haystack[start+compareCount]==needle[compareCount]){
            compareCount++
            if(compareCount==len2)
                return start
        }

        val checkIndex=start+len2

        val lastIndex =if(checkIndex<len1) map[haystack[checkIndex]] else null
        start += if(lastIndex!=null){
            len2-lastIndex
        }else{
            start+len2+1

        }

    }
    return -1
}

最後

本來今天挺累的,想早點睡覺的,結果寫這點代碼+這篇文章就花了兩個多小時,就爲了拿到盤Android的文章分享積分,真不容易呀

參考資料

字符串匹配之Sunday算法
字符串匹配——Sunday算法

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章