字符串匹配算法之暴力做法(朴素算法)

  • 1.字符串匹配算法
    • 1.1 简介
    • 1.2 类型
    • 1.3 示例题目
  • 2.暴力做法(朴素算法)
    • 2.1 暴力算法的思路
    • 2.2 暴力算法的特点:
    • 2.3 暴力算法的Java实现

1.字符串匹配算法

首先我们需要了解,什么是字符串匹配算法?

1.1 简介

又称模式匹配(pattern matching)。该问题可以概括为「给定字符串ST,在主串S中寻找子串T」。字符T称为模式串 (pattern)。

1.2 类型

  • 单串匹配:给定一个模式串和一个待匹配串,找出前者在后者中的所有位置。

  • 多串匹配:给定多个模式串和一个待匹配串,找出这些模式串在后者中的所有位置。

    • 出现多个待匹配串时,将它们直接连起来便可作为一个待匹配串处理。
    • 可以直接当做单串匹配,但是效率不够高。
  • 其他类型:例如匹配一个串的任意后缀,匹配多个串的任意后缀……

1.3 示例题目

以下题目来自leetcode 28. 实现 strStr()。这就是最经典的字符串单模匹配题。

实现 strStr() 函数。
给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串出现的第一个位置(下标从 0 开始)。如果不存在,则返回 -1 。
示例 1:

输入: haystack = "hello", needle = "ll"
输出: 2

2.暴力做法(朴素算法)

2.1 暴力算法的思路

暴力算法(Brute Force Algorithm)又叫朴素字符串匹配算法(Naive String Matching Algorithm)。
该算法的基本思路就是将字符一个一个地进行比较:

  • 如果ST两个字符串的第一个字符相同就比较第二个字符,如果相同就一直继续;
  • 如果其中有某一个字符不同,则将T字符串向后移一位,将S字符串的第二个字符与T的字符串的第一个字符重新开始比较。
  • 循环往复,一直到结束。

伪代码如下:

 NAIVE-STRING-MATCHER(T, P)
2  n ← length[T]
3  m ← length[P]
4  for s ← 0 to n - m
5    do if P[1 .. m] = T[s + 1 .. s + m]
6      then print "Pattern occurs with shift" s

2.2 暴力算法的特点:

我们通过伪代码的学习,可以发现暴力算法称不上高效,而这些特点就是原因。

  1. 没有预处理阶段;
  2. 滑动窗口总是后移 1 位;
  3. 对模式中的字符的比较顺序不限定,可以从前到后,也可以从后到前;
  4. 匹配阶段需要 O((n - m + 1)m) 的时间复杂度;
  5. 需要 2n 次的字符比较;

2.3 暴力算法的Java实现

就用之前提到过的leetcode28题的代码来当作Java实现。字符串匹配还有KMP、Rabin-Karp算法以及boyer-moore算法等,到时候我也会更新在这个专栏里。

class Solution {public int strStr(String haystack, String needle) {int m = haystack.length(),n = needle.length();for(int i = 0;i<=m-n;i++){boolean flag = true;for(int j =0;j<n;j++){if(haystack.charAt(i+j) != needle.charAt(j)){flag = false;break;}}if(flag){return i;}}return -1;}
}

字符串匹配算法之暴力做法(朴素算法)相关推荐

  1. 字符串匹配算法(三):KMP(KnuthMorrisPratt)算法

    文章目录 KMP 原理 next数组的构建 代码实现 KMP 一提到字符串匹配算法,想必大家脑海中想到的第一个必然就是KMP算法,KMP算法的全称叫做KnuthMorrisPratt算法,与上一篇博客 ...

  2. 字符串匹配算法(二):BM(BoyerMoore)算法、坏字符规则,好后缀规则

    文章目录 BM算法 坏字符规则 好后缀规则 完整代码 BM算法 BM算法的全程叫做Boyer-Moore,是工程上最常用且最高效的字符串匹配算法,有实验统计,它的性能是著名的KMP 算法的 3 到 4 ...

  3. 字符串处理 —— 单模式匹配 —— 朴素的字符串匹配算法(BF 算法)

    [算法流程] 朴素的字符串匹配算法即暴力匹配算法(BF,Brute Force),其本质是暴力枚举,主要特点有: 没有预处理阶段: 滑动窗口总是后移 1 位: 对模式中的字符的比较顺序不限定,可以从前 ...

  4. 字符串匹配算法KMP算法

    数据结构中讲到关于字符串匹配算法时,提到朴素匹配算法,和KMP匹配算法. 朴素匹配算法就是简单的一个一个匹配字符,如果遇到不匹配字符那么就在源字符串中迭代下一个位置一个一个的匹配,这样计算起来会有很多 ...

  5. js实现kmp算法_字符串匹配算法KMP算法

    数据结构中讲到关于字符串匹配算法时,提到朴素匹配算法,和KMP匹配算法. 朴素匹配算法就是简单的一个一个匹配字符,如果遇到不匹配字符那么就在源字符串中迭代下一个位置一个一个的匹配,这样计算起来会有很多 ...

  6. 字符串匹配算法——JavaScript

    字符串匹配算法--javascript 文章目录 字符串匹配算法--javascript 字符串匹配 BF算法 (暴力匹配) √ KMP算法 √ BM算法 **坏字符规则** 好后缀规则 Trid树( ...

  7. 蓝桥杯 黑白无常 朴素算法

    试题 算法训练 黑白无常 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 某寝室的同学们在学术完之后准备玩一个游戏:游戏是这样的,每个人头上都被贴了一张白色或者黑色的纸,现在每个人都 ...

  8. Java实现算法导论中朴素字符串匹配算法

    朴素字符串匹配算法沿着主串滑动子串来循环匹配,算法时间性能是O((n-m+1)m),n是主串长度,m是字串长度,结合算法导论中来理解,具体代码参考: package cn.ansj;public cl ...

  9. 字符串匹配算法——暴力算法

    字符串匹配算法--暴力算法,简称BF(BruteForce)BF(Brute\:Force)BF(BruteForce)算法. 基本思想:从主串(str)(str)(str)的第一个字符开始和子串(p ...

最新文章

  1. 我的理解:box-sizing
  2. 设置windows xp 调试
  3. HDU多校3 - 6975 Forgiving Matching(多项式匹配字符串)
  4. 《Node.js区块链开发》——1.6 参考
  5. iosalipay_iOS支付宝支付主要代码
  6. OpenShift Security (1) - 红帽多集群安全管理 RHACS 的主要功能和技术架构
  7. 开发人员必备的 Chrome 扩展
  8. Dart基础第12篇:一个类实现多个接口 以及Dart中的Mixins
  9. java javax.crypto.mac dofinal_Java密码学 - 2. MAC example
  10. 虚拟化云计算-centos7上使用virt-manager安装虚拟机
  11. handsontable的单元格操作方法
  12. linux系统date命令(时间戳与日期相互转换)
  13. .net下如何压缩图片大小,超简单
  14. Java女生后来_那些主动的女生后来怎么样了?
  15. 银行大数据风控管理针对哪些应用场景?
  16. 被薪资倒挂,身为老员工的我要跳槽吗?|智测优聘总结
  17. Android从网页中跳转到APP
  18. 华为实习密文cipherText破解
  19. python学习笔记——字符串操作
  20. 在深圳,让我们一起洞见技术的未来——2018 技术雷达峰会

热门文章

  1. r股票数据接口读取CSV文件
  2. python db读写实践
  3. 夺命雷公狗---node.js---2node.js中的npm的常用命令
  4. Mac 小白指南 从入门到精通
  5. 满足中二魂却没啥用的 5 款开发者工具
  6. 任务驱动的多轮对话究竟该如何实现?
  7. 重写(override)equals方法的必要性探究
  8. python调用c++动态库
  9. 【前端学习笔记】移动web-黑马程序员学习笔记
  10. Android2.3系统增加阿拉伯语支持, 共支持57国语言