【譯】Swift演算法俱樂部-暴力字串搜尋

Andy_Ron發表於2019-03-02

本文是對 Swift Algorithm Club 翻譯的一篇文章。

Swift Algorithm Clubraywenderlich.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並且不能使用NSStringrangeOfString()方法,那麼如何在純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字串搜尋。

作者:Matthijs Hollemans
翻譯:Andy Ron
校對:Andy Ron

相關文章