本文是對 Swift Algorithm Club 翻譯的一篇文章。
Swift Algorithm Club是 raywenderlich.com網站出品的用Swift實現演算法和資料結構的開源專案,目前在GitHub上有18000+⭐️,我初略統計了一下,大概有一百左右個的演算法和資料結構,基本上常見的都包含了,是iOSer學習演算法和資料結構不錯的資源。
?andyRon/swift-algorithm-club-cn是我對Swift Algorithm Club,邊學習邊翻譯的專案。由於能力有限,如發現錯誤或翻譯不妥,請指正,歡迎pull request。也歡迎有興趣、有時間的小夥伴一起參與翻譯和學習?。當然也歡迎加⭐️,?????。
本文的翻譯原文和程式碼可以檢視?swift-algorithm-club-cn/Brute-Force String Search
暴力字串搜尋(Brute-Force String Search)
如果不允許匯入Foundation
並且不能使用NSString
的rangeOfString()
方法,那麼如何在純Swift中編寫字串搜尋演算法呢?
目標是在String
上實現indexOf(pattern: String)
擴充套件,返回第一次出現的搜尋模式的String.Index
,如果在字串中找不到模式,則返回nil
。
例子:
// Input:
let s = "Hello, World"
s.indexOf("World")
// Output:
<String.Index?> 7
// Input:
let animals = "?????????????????????"
animals.indexOf("?")
// Output:
<String.Index?> 6
複製程式碼
注意: 牛的索引是6,而不是你想象的3,因為字串為表情符號使用更多的儲存空間。
String.Index
的實際值並不那麼重要,只要它指向字串中的正確字元。
這是暴力解決方案:
extension String {
func indexOf(_ pattern: String) -> String.Index? {
for i in self.indices {
var j = i
var found = true
for p in pattern.indices {
if j == self.endIndex || self[j] != pattern[p] {
found = false
break
} else {
j = self.index(after: j)
}
}
if found {
return i
}
}
return nil
}
}
複製程式碼
這將依次檢視源字串中的每個字元。 如果字元等於搜尋模式的第一個字元,則內部迴圈檢查模式的其餘部分是否匹配,如果未找到匹配項,則外迴圈將從中斷處繼續。 重複此過程直到找到完全匹配或到達源字串的結尾。
暴力方法執行正常,但效率不高(或漂亮)。 不過,暴力方法應該可以在小字串上正常工作。 對於使用大塊文字更好的智慧演算法,請檢視Boyer-Moore字串搜尋。