Java数据结构之字符串模式匹配算法---Brute-Force算法

模式匹配

在字符串匹配问题中,我们期待察看源串 “ S串 ” 中是否含有目标串 “ 串T ” (也叫模式串)。其中 串S被称为主串,串T被称为子串。

1、如果在主串中查找到子串,则称为模式匹配成功,返回模式串的第一个字符在主串中出现的位置。

2、如果在主串中未找到子串,则称为模式匹配失败,返回-1。

在模式匹配过程中有两个比较经典的算法:Brute-Force与KMP算法是两种最经典的模式匹配算法。

在本片中主要分析BF算法,很黄很暴力。下面是简单的思路解析:

     1.其基本思路是:从目标串s=“ s0s1…sn-1 ”的第一个字符开始和模式串t=“ t0t1…tm-1 ”中的第一个字符比较,若相等,则继续逐个比较后续字符,否则,从目标串s的第2个字符开始重新与模式串t的第一个字符进行比较,依次类推,若从目标串s的第i个字符开始,每个字符依次和模式串t中的对应字符相等,则匹配成功,该算法返回i;否则匹配失败,返回-1。

     2.举个栗子:

设主串s=“cddcdc”,模式串t=“cdc”,模式匹配过程如图:

//================================

 1 //字符串的模式匹配算法,之BF算法
 2 public class BruteForce {
 3     //
 4     /**
 5      *
 6      * @param src
 7      *            主串
 8      * @param sub
 9      *            字串(模式串)
10      * 算法比较简单,缺点是每一次进行回溯效率不高,回溯往往是没有必要
11      */
12     public static int bruteFore(String src, String sub) {
13         int i = 0, j = 0;
14         int index = -1;
15         while (i < src.length() && j < sub.length()) {
16             if (src.charAt(i) == sub.charAt(j)) {
17                 i++;
18                 j++;
19             } else {
20                 /**
21                  * 这里理解一下下面的公式:该式子的目的是保证i的值在匹配不成功时不断向后+1 j其实表示已经成功匹配的字符数,
22                  * i是一个不断累加的过程
23                  */
24                 i = i - j + 1;
25                 j = 0;
26             }
27         }
28         // 判断
29         if (j == sub.length()) {
30             // 此处表示在index处开始匹配,并且后面完全匹配成功
31             index = i - sub.length();
32         }
33
34         return index;
35     }
36 }

该算法与上面的图示例子对应,可以自己阅读理解。

下转KMP算法

时间: 2024-10-25 03:46:49

Java数据结构之字符串模式匹配算法---Brute-Force算法的相关文章

Java数据结构之字符串模式匹配算法---KMP算法

本文主要的思路都是参考http://kb.cnblogs.com/page/176818/ 如有冒犯请告知,多谢. 一.KMP算法 KMP算法可以在O(n+m)的时间数量级上完成串的模式匹配操作,其基本思想是:每当匹配过程中出现字符串比较不等时,不需回溯指针,而是利用已经得到的"部分匹配"结果将模式向右"滑动"尽可能远的一段距离,继续进行比较.显然我们首先需要获取一个"部分匹配"的结果,该结果怎么计算呢? 二.算法分析 在上一篇中讲到了BF算法,

Java数据结构之字符串模式匹配算法---KMP算法2

直接接上篇上代码: 1 //KMP算法 2 public class KMP { 3 4 // 获取next数组的方法,根据给定的字符串求 5 public static int[] getNext(String sub) { 6 7 int j = 1, k = 0; 8 int[] next = new int[sub.length()]; 9 next[0] = -1; // 这个是规定 10 next[1] = 0; // 这个也是规定 11 // 12 while (j < sub.l

[转] 字符串模式匹配算法——BM、Horspool、Sunday、KMP、KR、AC算法一网打尽

字符串模式匹配算法——BM.Horspool.Sunday.KMP.KR.AC算法一网打尽 转载自:http://dsqiu.iteye.com/blog/1700312 本文内容框架: §1 Boyer-Moore算法 §2 Horspool算法 §3 Sunday算法 §4 KMP算算法 §5 KR算法 §6 AC自动机 §7 小结 §1 Boyer-Moore(BM)算法 Boyer-Moore算法原理 Boyer-Moore算法是一种基于后缀匹配的模式串匹配算法,后缀匹配就是模式串从右到

字符串模式匹配算法--详解KMP算法

在软考的复习中,看到过几次  字符串的模式匹配算法.看起来挺难的.所以花了点时间查了查关于字符串匹配的算法.下面详细介绍一下KMP模式匹配算法 什么是字符串的匹配? 在文章中进行查找.需要找到要查找的内容所在的位置.就是字符串的匹配. 朴素的模式匹配算法 朴素的模式匹配算法,就是把要查找的内容,一步步的与要查找的文章进行进行比较.如果匹配失败,则主串和字串回溯.字串位置加1.重新匹配. 模式匹配算法的流程如下: 在匹配失败的情况下,模式串仅右移一个 之后.在从头开始匹配. 两个for循环 For

字符串模式匹配算法之二:KMP算法

KMP算法简介 KMP算法全称叫做Knuth-Morris-Pratt Algorithm. 被搜索的字符串称为主串,待搜索的字符串称为模式串. 我们知道朴素模式匹配算法:http://blog.csdn.net/chfe007/article/details/43448655是很低效的,KMP算法从模式串出发,发现模式串中隐藏的信息来减少比较的次数,具体如何做到的可以移步这个链接:http://kb.cnblogs.com/page/176818/ KMP算法的关键在于next数组值的推导.

字符串模式匹配算法之一:朴素模式匹配算法

被搜索的字符串称为主串,待搜索的字符串称为模式串.朴素模式匹配算法的基本思想: 对主串的每一个字符作为子串开头,与模式串进行匹配.对主串做大循环,每个字符开头做模式串长度的小循环,直到匹配成功或全部遍历完成为止. 代码实现非常简单: int strStr(char *haystack, char *needle) { for (int i = 0; ; ++i) { for (int j = 0; ; ++j) { if (!needle[j]) return i; if (!haystack[

数据结构- 串的模式匹配算法:BF和 KMP算法

Brute-Force算法的思想 1.BF(Brute-Force)算法 Brute-Force算法的基本思想是: 1) 从目标串s 的第一个字符起和模式串t的第一个字符进行比较,若相等,则继续逐个比较后续字符,否则从串s 的第二个字符起再重新和串t进行比较. 2) 依此类推,直至串t 中的每个字符依次和串s的一个连续的字符序列相等,则称模式匹配成功,此时串t的第一个字符在串s 中的位置就是t 在s中的位置,否则模式匹配不成功. Brute-Force算法的实现 c语言实现: [cpp] vie

KMP字符串模式匹配算法(C++实现)

鉴于原理有点复杂,详细原理可以参考这篇文章http://blog.csdn.net/v_july_v/article/details/7041827 本文直接从结论入手,应付考试和竞赛足够了. 设T为目标串("aaabbbaabbabcabcabbaba"),pat为模式串("aabbabc"). 这是模式串的next数组: j(下标) 0 1 2 3 4 5 6 pat a a b b a b c next[j] -1 0 1 0 0 1 0 KMP算法: j=0

kmp字符串模式匹配算法

概述 ??kmp算法我觉得有两个关键点:1.计算模式字符串的部分匹配表(这时候,自己跟自己比较)2.匹配主串时候,主串字符只遍历一遍,匹配时候,根据模式串的部分匹配表计算模式串应该移动的位置.kmp算法时间复杂度为O(m+n);下面我实现的算法代码(PHP) 理论 关于kmp理论部分,这篇文章写得好:http://kb.cnblogs.com/page/176818/.我就不再赘述了. 计算部分匹配表 function kmp_next($string){ $length = strlen($s