美文网首页Algorithms
子字符串查找(1)

子字符串查找(1)

作者: null12 | 来源:发表于2018-03-22 16:39 被阅读0次

一、定义

本文主要介绍子字符串查找的各类常用算法,如朴素匹配算法(暴力查找)、KMP算法、BM算法等。各类匹配算法的比较见下图:

1-1 各类字符串匹配算法比较

可以看到,对于子字符串查找,最佳性能基本是和文本长度N成正比:

  1. 暴力查找算法实现简单,且在一般情况下都能工作良好,但是具体与文本规律有关,不能保证性能。
  2. KMP算法能够保证线性级别的性能,且文本指针不需要回退,需要额外的内存空间。
  3. BM算法一般都是亚线性级别,其性能通常要比KMP算法好,需要额外的内存空间。
  4. RK算法基于散列值的计算,一般不需要回退文本指针,但是存在冲突的可能,其性能也是线性级别。

二、暴力查找算法

2.1 定义

暴力查找算法(brute force,也称为朴素匹配算法),其思路就是,用指针i标识正在匹配的文本字符,指针j标识正在匹配的模式字符串:

  • 如果当前字符匹配成功(即txt[i] == ptn[j]),则i++j++,继续匹配下一个字符;
  • 如果失配(即txt[i]! = ptn[j]),则回溯指针ii = i - j + 1),j = 0,即每次匹配失败时,i回溯,j重置为0。
2-1 暴力查找算法示例

2.2 实现

/**
 * 基于回退的暴力查找子字符串
 * @param pat 模式字符串
 * @param txt 文本
 */
public static int search2(String pat, String txt) {
    int m = pat.length();
    int n = txt.length();
    int i, j;    //指针i跟踪文本,指针j跟踪模式字符串
    while(i < n && j < m) {
        if (txt.charAt(i) == pat.charAt(j)) {
            i++;
            j++;
        }
        else {
            i = i-j+1;
            j = 0;
        }
    }
    if (j == m) return i - j;     // found
    else        return -1;        // not found
}

2.3 性能分析

  • 时间复杂度:
    最坏情况:O(MN)
    平均情况:O(M+N)
    其中 M:模式字符串长度 , N:文本长度

相关文章

  • 字符串增强功能

    1、查找子字符串 在以前在字符串中查找字符串的时候,都是使用indexOf方法。ES6新增了三个方法来查找字符串。...

  • 《算法》-字符串[子字符串查找]

    字符串的一种基本操作就是子字符串查找。比如在文本编辑器或是浏览器中查找某个单词时,就是在查找子字符串。子字符串的长...

  • Go 关于串的三个经典案例

    子串查找 介绍 子串查找,也可以成为字符串查找。其中有两个字符串,分为主串和子串(模式串)。在主串中查找是否含有子...

  • 子字符串查找(1)

    一、定义 本文主要介绍子字符串查找的各类常用算法,如朴素匹配算法(暴力查找)、KMP算法、BM算法等。各类匹配算法...

  • Python 字符串中查找字符或字符串

    find():检测字符串中是否包含字符或子字符串,未查找到子字符串返回-1str.find(str, beg=0,...

  • 算法与数据结构练习中常犯错误4——字符串相关算法

    3.字符串 3.1 字符串压缩 3.2 字符串查找——trie树 3.3 子字符串查找 3.3.1 暴力解法 3....

  • JAVA5:String的基本操作

    关于字符串的基本操作: 1.查找字符串的位置,查找字符串某位置的字符;2.获取子字符串,通过两种重载过的subst...

  • (一) IOS学习之---NSString & NSMu

    -NSString 1.NSString 创建: 2.字符串比较: 3.查找子字符串位置 (字符串位置从0开...

  • 字符串查找

    从一个完整的字符串之中查找子字符串的存在就属于字符串查找,在String类里面提供如下的查找方法: indexOf...

  • 【17】python第十七--字符串查找

    字符串的常用操作方法有查找、修改和判断三大类。 4.1查找所谓字符串查找方法即是查找子串在字符串中的位置或出现的次...

网友评论

    本文标题:子字符串查找(1)

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