美文网首页
字符串匹配算法

字符串匹配算法

作者: NapoleonY | 来源:发表于2020-07-07 10:50 被阅读0次

Sunday 算法

从前往后匹配,匹配失败时关注的是主串中参加匹配最末位字符下一位字符

  1. 如果该字符串没有在模式串中出现过,则直接跳过,移动位数 = 模式串长度 + 1
  2. 否则,移动位数 = 模式串中该字符从右往左数的位置(1 为初始索引)


    动图

举例

主串”substring searching”中查找模式串”search”

  1. 主串和模式串对齐
  2. 在第2个字符串处不匹配
  3. 当前匹配串最末位的下一位字符 "i 不在模式串中
  4. 直接将匹配位置移动到 n 的位置
  5. 仍然不匹配,但是此时匹配串最末位的下一个字符 "r" 在模式串中,移动模式串,使两个 "r" 对齐。
  6. 匹配成功

LeetCode 28 题

28 实现 strStr() 函数。
给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在,则返回 -1。

func strStr(_ haystack: String, _ needle: String) -> Int {
    guard !needle.isEmpty else {
        return 0
    }
    guard !haystack.isEmpty else {
        return -1
    }
    let needle = Array(needle)
    let hayStack = Array(haystack)

    // pattern offset
    var patternDic: [Character: Int] = [:]
    for index in 0..<needle.count {
        patternDic[needle[index]] = needle.count - index
    }

    var index: Int = 0
    while index <= (hayStack.count - needle.count) {
        var j: Int = 0
        // 判断 need 与 index...(index + j) 是否匹配
        while hayStack[index + j] == needle[j] {
            j += 1
            if j >= needle.count {
                return index
            }
        }
        // 不匹配,则计算偏移
        guard index + needle.count < hayStack.count else {
            return -1
        }
        let offset = patternDic.keys.contains(hayStack[index + needle.count]) ?
                                              patternDic[hayStack[index + needle.count]]! :
                                              needle.count + 1
        index += offset
    }
    return -1
}

Sunday 算法缺点

主串:aaaabaaaabaaaabaaaa
模式串:aaaaa
匹配失败,模式串每次移动位置 1,时间复杂度为 O(m*n)

参考

  1. 动画演示Sunday字符串匹配算法——比KMP算法快七倍!极易理解!
  2. 字符串匹配算法之Sunday算法

相关文章

  • 字符串匹配

    indexOf 底层就是使用字符串匹配算法 字符串匹配算法很多 BF( Brute Force)算法 暴力匹配算...

  • KMP字符串匹配算法

    KMP字符串匹配算法 先总结一下之前的几种字符串匹配算法 1 BF算法, 最简单的字符串匹配算法, 可以直接使用s...

  • KMP算法文章合集

    字符串的查找:朴素查找算法和KMP算法 暴力匹配算法与KMP算法(串的匹配) 字符串查找算法BF和KMP 字符串匹...

  • 一些有关算法的

    字符串模式匹配算法 字符串的KMP算法详解部分匹配表(即)向右移一位就可以得到next数组。字符串模式匹配算法 R...

  • 字符串匹配算法

    场景:字符串A为主串,字符串B为模式串,比较字符串B是否能够在字符串A中进行匹配? 匹配算法:BF算法和RK算法。...

  • 字符串匹配算法

    以下为学习 《数据结构与算法之美 -- 字符串匹配》 的记录。 BF算法 即暴力匹配算法,循环遍历匹配。 RK算法...

  • 2022-01-25

    1.字符串匹配BM算法 在文本中查找字符串匹配算法,坏字符串规则和好后缀规则坏字符串规则: 从后往前匹配,第一个不...

  • 20-字符串匹配

    字符串匹配 这章节,我们会讲到几大典型的字符串匹配算法 BF算法 BF算法是最最符合正常人逻辑思维的一种匹配模式,...

  • leetcode字符串匹配算法之KMP算法

    本篇介绍一种高效的字符串匹配算法——KMP算法。 KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J....

  • 中文分词的方法

    1、基于字符串匹配的方法 1.1 正向最大匹配分词算法1.2 逆向最大匹配分词算法1.3 双向最大匹配分词算法1....

网友评论

      本文标题:字符串匹配算法

      本文链接:https://www.haomeiwen.com/subject/wpxaqktx.html