字符串查找算法:暴力、KMP、DFA

本文为博客 VIP 文章,开通 VIP 后可阅读全文

开通 VIP

1. 暴力查找

给出主串txt, 模式串pat, 查找pat在txt中出现的位置,不存在则返回-1

package algorithm;

public class SubstrSearchDemo {
   
   

	/*
	 * 在txt主串中查找子串pat第一次出现的位置
	 */
	public static int search(String pat,String txt) {
   
   
		int M=pat.length();
		int N=txt.length();
		//pat在txt的起始位置为[0,N-M) pat本身长度为M 
		//在位置N-M-1处往后找还不能匹配  后面也就不可能匹配了
		for(int i=0;i<N-M;i++)
		{
   
   
			int j;
			for(j=0;j<M;j++)//j扫描模式串pat 
			{
   
   
				if(pat.charAt(j)!=txt.charAt(i+j))//不等直接跳出
					break;
			}
			if(j==M)//j==M说明[0,M-1]都匹配了  匹配成功
				return i;
		}
		return -1;//未找到返回-1
	}
	public static void main(String[] args) {
   
   
		String txt="helloworld";
		String pat="llo";
		System.out.println(search(pat, txt));//2
	}
}

时间复杂度:O(MN)

暴力法的一种优化:查找失败时,i不需要回退到0,回退到i-j的位置即可, j是已经匹配成功的序列的长度
证明:反证法:假设区间[0,i-j-1]存在一个start,以该start为字符序列的开始位置,可以匹配成功,则不会到达当前j的位置,在j之前就已经匹配成功了,但是现在到达了j位置,所以说明以[0,i-j-1]内的任何位置为起点都不能匹配成功,证毕

package algorithm;

public class SubstrSearchDemo {
   
   

	/*
	 * 在txt主串中查找子串pat第一次出现的位置
	 */
	public static int search(String pat,String txt) {
   
   
		int M=pat.length();
		int N=txt.length();
		int i,j;
		//i指向txt中匹配过的字符序列的末端
		for(i=0,j=0;i<N&&j<M;i++)
		{
   
   
			if(pat.charAt(j)==txt
算法#15--子字符串查找算法汇总和代码详解 字符串查找算法汇总和代码详解。 阅读详情

相关推荐

算法之深度剖析KMP字符串查找算法

算法的学习道路上,每一次对新算法的探索都是一次成长的契机。我深知独自钻研算法的艰辛,也明白分享交流能让学习变得更加高效和有趣。所以,今天我想把自己在学习KMP字符串查找算法过程中的收获分享给大家,希望我们能一起学习进步,共同攻克算法世界里的各种难题。

wj_rdk的博客 1281

二、C++反作弊对抗实战 (进阶篇 —— 4.遍历进程模块(暴力扫描整个内存找出被断链的))

提示:以下是本篇文章正文内容,下面案例可供参考 一、前言 由于上一章节中的MsgBox已经被抹去PE头、断链隐藏了DLL,导致将无法正常遍历出当前进程的所有模块,这时候就需要用到暴力内存的方法了。因为断链这种方法只能欺骗常规的CreateToolhelp32Snapshot、Module32First、Module32Next三个遍历函数,而当我们真正使用暴力扫描内存的方法后,这个”隐藏“的MsgBox.dll一样能被扫描出来。 这里我们得用前面章节介绍的Native API ZwQueryVi...

Koma的主页 1284

算法KMP字符串查找算法:原理、实现应用

算法的学习旅程中,我始终相信分享交流能让我们收获更多。每次攻克一个新的算法难题,都像是打开了一扇通往新世界的大门,里面充满了奇妙的知识和技巧。今天,我就迫不及待地想和大家分享我在学习子字符串查找算法时的重要收获——Knuth - Morris - Pratt(KMP算法,希望我们能一起进步,在算法的海洋里探索得更深更远。

wj_rdk的博客 1679

KMP算法中关于构造DFA部分的纠结

在《算法》(Sedgewick)一书中,看到了KMP算法,看了一遍没懂,但觉得挺神奇的,就花费了几个小时深入的理解。 算法的原理其实不难,难的就是那个神奇的DFA数组,我的大部分时间也都是花费在这个数组上面的。 以下从豆瓣读书找来的问题及答案,看着不错,就给抠来了~ 出处:http://book.douban.com/subject/19952400/discussion/59623403/

Niko's blog 2567

字符串查找算法BF、KMP详解

KMP、BF算法详解

Dwyane0030的博客 2086

字符串查找以及查重方法总结

掌握要求: 1、字符串查找的朴素算法 2、字符串查找KMP算法 3、哈希表 4、字典树 1、字符串查找之朴素算法 朴素算法思想很简单,就是将待查找字符串t在被查找字符串s中一一对比,如果遇到相同字符就将t和s同时往后挪,再依次比较;如果将t子串一直比较完了都s中对应的连续位置元素相等的话,则就成功找到了字串的位置,但若t子串未比较完就s中元素不相同,则将t返回到第一个元素,而s返回到刚...

是袁同学呀 7275

KMPDFA 实现

目录 前言 朴素子字符串查找算法 KMP 算法的基本思想 基于 DFAKMP 实现 朴素子字符串查找算法 KMP 算法是用来解决子字符串查找问题的算法,这个问题有一个很朴素(暴力)的解决方式,通常的写法是: def bf_search(txt: str, pat: str) -> int: i, j, txt_len, pat_len = 0, 0, len(txt), len(pat) while i < txt_len ...

qq_38003454的博客 687

(一)KMP算法DFA解法

简单说一下,KMP是一个时间复杂度O(n+m)的字符串匹配算法,网上也有很多其他的解法,比如next数组的解法,推荐看这里匹配的思路DFA:确定有限自动状态机 以下是ABABAC的对应的DFA: 1.假设文本为txt,待匹配的子串为pat。2.未匹配是状态0,此时如果条件A(匹配到了txt的字符‘A‘),会到状态1,如果是条件B、C或其他的条件,还是状态0。如果经历了匹配ABABA之后到达状态5

小魏同学的随想随写 1804

算法-24-子字符串查找暴力+KMP+BM+RK)

1、定义 子字符串查找:给定一段长度为 N 的文本和一个长度为 M 的模式 (pattern)字符串,在文本中找到一个和该模式相符的子字符串。解决该问题的大部分 算法都可以很容易地扩展为找出文本中所有和该模式相符的子字符串、统计该模式在文本中的出现次 数、或者找出上下文(和该模式相符的子字符串周围的文字)的算法。 2、暴力字符串查找字符串查找的一个最显而易见的方法就是遍历文本...

Yo.o 1433

基于dfakmp算法思想

1.kmp算法的由来及其思想 在一段字符串查找指定的子串时(例如在一段由A,B,C字符组成的字符串查找ABABAC),我们通常的做法是将模式字符串(在本例中即ABABAC)的开头字符查找字符串一个一个进行比较,当匹配成功时比较模式字符串的下一个字符和被查找字符串的下一个字符,当匹配失败时则回退模式串指针到第一个字符,以及回退文本指针到比较开始的下一个字符。具体情况在这里不需要作过多的介绍

liqq654628833的博客 1109

DFA角度理解KMP算法

KMP 算法KMP(Knuth-Morris-Pratt)算法字符串查找中是很高效的一种算法,假设文本字符串长度为n,模式字符串长度为m,则时间复杂度为O(m+n),最坏情况下能提供线性时间运行时间保证。《算法导论》和其他地方在讲解KMP算法的时候,过于数学化且晦涩难懂,我也因此迷惑了很长时间。后来看《算法(第四版)》部分的讲解,对其中最复杂的Next数组有了重新的认识。我这里也希望用通俗的语言来

DC的陋室 1万+

字符串之子字符串查找

字符串查找  字符串的一种基本操作就是子字符串查找:给定一段长度为N的文本text和一个长度为M的模式字符串pattern,在文本中找到一个和该模式相符的子字符串。解决该问题的大部分算法都可以很容易地扩展为找出文本中和该模式相符的子字符串,统计该模式在文本中的出现次数,或者找出上下文(和该模式相符的子字符串周围的文字)的算法。现如今主要算法暴力字符串查找KMP,BM字符串查找和RK指纹字符...

blank4569的专栏 4232

字符串查找算法----暴力算法KMP算法、Boyer-Moore算法和Rabin-Karp算法

各种算法比较 优缺点: 优点: 暴力查找算法:实现简单且在一般情况下工作良好(Java的String类型的indexOf()方法就是采用暴力字符串查找算法); Knuth-Morris-Pratt算法能够保证线性级别的性能且不需要在正文中回退; Boyer-Moore...

霍淇滨的博客 596

002字符串查找---KMP算法

字符串查找算法---KMP算法本文参考《算法(第4版)》1.暴力字符串查找算法2.总结 本文参考《算法(第4版)》 1.暴力字符串查找算法字符串查找的最显而易见的方法就是在文本模式中任何可能发生匹配的地方检查匹配是否存在。 暴力字符串查找算法是一种子字符串查找算法,是模式字符串在文本字符串中逐个字符进行比较。 search()方式使用一个指针 i 跟踪文本字符串,使用一个指针 j 跟踪跟踪模...

m0_37692918的博客 264

c++ kmp算法字符匹配_KMP/BoyerMoore/RabinKarp字符串查找算法讲解

暴力字符串查找算法对于字符串txt和子字符串pat,判断txt中是否包含pat,如果有找出pat的位置。一般的思路是从txt的字符0-npat的字符0-m进行匹配,如果遇到不匹配的字符,再从txt的字符1-npat的字符0-m进行匹配,直到pat的字符都匹配了或txt的字符都遍历完了。代码如下: public static int search1(String pat, String ...

weixin_39595537的博客 322

KMP字符串匹配算法

最近看了《算法(第4版)》(谢路云 译)上关于Knuth-Morris-Pratt(以下简称KMP)子字符串查找算法的介绍,看完之后不能清晰地理解算法的意思,特别是生成DFA二维数组那段代码,尽管只有短短数行,但却不明其义。几经思考,略有所解,现将一些想法记录下来。文中将待匹配的两字符串分别称为模式(pattern)和文本(text),在文本中查找模式是否存在。1. KMP算法相较于暴力匹配法的优...

MrLee的博客 1567

算法4第5章KMP/BoyerMoore/RabinKarp字符串查找算法讲解

暴力字符串查找算法 对于字符串txt和子字符串pat,判断txt中是否包含pat,如果有找出pat的位置。 一般的思路是从txt的字符0-npat的字符0-m进行匹配,如果遇到不匹配的字符,再从txt的字符1-npat的字符0-m进行匹配,直到pat的字符都匹配了或txt的字符都遍历完了。代码如下: public static int search1(String pat, Strin...

cyj88jyc的专栏 376

字符串查找算法(BF、KMP、BM、RK)

字符串查找算法,包括暴力算法KMP的自动机实现和next实现、BM、RP的总结

qq_40575565的博客 642
上一篇: Lambda表达式详解
下一篇: LockSupport工具类的使用
CodePanda@GPF
博客等级 码龄8年 1万+粉丝 266原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CodePanda@GPF

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值