廢話
今天之前,我只知道KMP(看貓片)算法,昨天剛看了28. 實現 strStr(),今天早上剛剛從一個KMP算法的評論裏面知道了還有這個Sunday算法,作爲一個程序員,我最喜歡週末了。
字符串匹配算法通常包含BF、KMP、BM、Sunday。
-
BF是最簡單暴力的算法
-
KMP是最廣爲人知的算法
-
BM效率高,複雜
-
Sunday簡單且高效
正文
Sunday算法的最主要特點就是思路簡單,不像KMP。
如圖,在匹配不上的時候,直接比較“主串”此次匹配結束位置的後一位是否在“模式串”中
- 不在(圖中i不在模式串中),則主串中比對的起點(圖中的起點是s)向後移動模式串的長度+1(s->6+1=n);
比較n,又不等,又如上看結束後的後一位(r): - 在(r在模式串中),則主串起點向後移動"模式串長度-字符在模式串中最後一次出現的下標"(從n->(6-3)=s)
繼續比對,匹配長度等於模式串長度,匹配成功,返回當前起點。
代碼
/**
* 學習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的文章分享積分,真不容易呀