字符串匹配 - sunday算法
常见的字符串匹配算法有BF、KMP(教科书中非常经典的)、BM、Sunday算法
这里主要想介绍下性能比较好并且实现比较简单的Sunday算法 。
基本原理:
从前往后匹配,如果遇到不匹配情况判断母串参与匹配的最后一位的下一位字符
,如果该字符出现在模板串中,选择最右出现的位置进行对齐;
否则直接跳过该匹配区域。
画图说明:
首先下标为0 的字符相互比较,发现并不相等,
然后查找 s 中参与匹配的最后一位字符的下一字符 ,即 i , 看 i 在是不是在t中(从右向左匹配) 发现i不在t中,
接下来 s后移2(即t.length())位,到i处,发现i不存在于t中,于是 s后移2(即t.length())位,到x处 发现x存在于t中
于是s在移动(t.length()-x在t中出现的下标) 在做比较
代码演示:
public class SundaySearch { public static void main(String[] args) {
String s = "thiexaamp";
String t = "ex";
int rtn = sundaySearch(s, t);
System.out.println(rtn);
}
/**
* source 母串
* target 模板串
* 返回值 如果存在就返回target的第一个字符在source的下标
*
*/
private static int sundaySearch(String source, String target) {
int loc = 0;
int locSource = 0;
int locTarget = 0;
int count = 0; //用于记录有几个字符相同,如果与locTarget的长度相等就找到了 while (locSource < source.length() && locTarget < target.length()) {
if (target.charAt(locTarget) == source.charAt(locSource)) {
locTarget++;
locSource++;
count++;
} else {
count = 0;
if (locSource < source.length() - target.length()) {
//看原下标+target.length()位的元素是不是在target中,(从右往左匹配)
loc = target.lastIndexOf(source.charAt(locSource + target.length()));
} else {
break;
}
if (loc == -1) {//不存在 locSource 移动target.length()位
locSource = locSource + target.length();
} else {
//存在,右移(target.length() - loc) 位
locSource = locSource + target.length() - loc;
}
locTarget = 0;
}
}
if (loc != -1 && count == target.length()) {
return locSource - count;
}
return -1;
}
}
运行结果如下
字符串匹配 - sunday算法的更多相关文章
- 通用高效字符串匹配--Sunday算法
字符串匹配(查找)算法是一类重要的字符串算法(String Algorithm).有两个字符串, 长度为m的haystack(查找串)和长度为n的needle(模式串), 它们构造自同一个有限的字母表 ...
- 字符串匹配KMP算法详解
1. 引言 以前看过很多次KMP算法,一直觉得很有用,但都没有搞明白,一方面是网上很少有比较详细的通俗易懂的讲解,另一方面也怪自己没有沉下心来研究.最近在leetcode上又遇见字符串匹配的题目,以此 ...
- 字符串匹配Boyer-Moore算法:文本编辑器中的查找功能是如何实现的?---这应该讲的最容易懂的文章了!
关于字符串匹配算法有很多,之前我有讲过一篇 KMP 匹配算法:图解字符串匹配 KMP 算法,不懂 kmp 的建议看下,写的还不错,这个算法虽然很牛逼,但在实际中用的并不是特别多.至于选择哪一种字符串匹 ...
- 字符串匹配常见算法(BF,RK,KMP,BM,Sunday)
今日了解了一下字符串匹配的各种方法. 并对sundaysearch算法实现并且单元. 字符串匹配算法,是在实际工程中经常遇到的问题,也是各大公司笔试面试的常考题目.此算法通常输入为原字符串(strin ...
- 字符串匹配--Karp-Rabin算法
主要特征 1.使用hash函数 2.预处理阶段时间复杂度O(m),常量空间 3.查找阶段时间复杂度O(mn) 4.期望运行时间:O(n+m) 本文地址:http://www.cnblogs.com/a ...
- 字符串匹配KMP算法
1. 字符串匹配的KMP算法 2. KMP算法详解 3. 从头到尾彻底理解KMP
- 字符串匹配--kmp算法原理整理
kmp算法原理:求出P0···Pi的最大相同前后缀长度k: 字符串匹配是计算机的基本任务之一.举例,字符串"BBC ABCDAB ABCDABCDABDE",里面是否包含另一个字符 ...
- 字符串匹配KMP算法的C语言实现
字符串匹配是计算机的基本任务之一. 举例来说,有一个字符串"BBC ABCDAB ABCDABCDABDE",我想知道,里面是否包含另一个字符串"ABCDABD" ...
- 字符串匹配KMP算法的讲解C++
转自http://blog.csdn.net/starstar1992/article/details/54913261 也可以参考http://blog.csdn.net/liu940204/art ...
随机推荐
- oslo_service服务
import time from oslo_service import service from oslo_config import cfg class MyService(service.Ser ...
- chromedriver和chrome匹配的版本
- sqlserver存储过程中调用存储过程
declare @value1 varchar(100)declare @value2 int exec xx.dbo.xxxxx 'param1', 'param2', 'param3', @val ...
- NDK环境搭建方法1
1.新建NdkDemo工程 2.新建NdkJniUtils类,在内部声明native方法 3.引用 4.build项目,生成NdkDemo\app\build\intermediates\classe ...
- 彻底弄懂css中单位px和em,rem的区别
PX:PX实际上就是像素,用PX设置字体大小时,比较稳定和精确.但是这种方法存在一个问题,当用户在浏览器中浏览我们制作的Web页面时,如果改变了浏览器的缩放,这时会使用我们的Web页面布局被打破.这样 ...
- 求组合数的O(n^2)和O(n)解法及模板
概率论中的组合数应该比较熟悉吧,在数论中组合数也具有重大意义,下面介绍组合数的解法: 方法一O(n^2): 利用公式(n,m)=(n-1,m-1)+(n-1,m): 模板: #include<c ...
- 第三章 列表(e)插入排序
- 151. Reverse Words in a String (String)
思路: 本题考查的目的并不是使用字符串的函数.方法是两次reverse,先对每个单词先做一次翻转,然后对整个字符串做一次翻转. 需要注意的是去除extra space,并且对全space字符串.以及最 ...
- oracle 中decode函数用法
学习记录: 含义解释: decode(条件,值1,返回值1,值2,返回值2,...值n,返回值n,缺省值) 该函数的含义如下:IF 条件=值1 THEN RETURN(翻译值1)ELSIF 条件=值2 ...
- jquery一些容易混淆的
1.父级元素.append子集元素 == 子集元素.appendTo父级元素 2.父级元素.prepend子集元素 == 子集元素.prependTo父级元素 3.同辈1.insertBefore同辈 ...