简介

Daniel M.Sunday于1990年提出的字符串模式匹配。其效率在匹配随机的字符串时比其他匹配算法还要更快,同时其实现方式比KMP,BM的实现容易太多。

算法原理

作为一个字符串模式匹配算法,Sunday算法的核心在于通过跳过尽可能多的字符来提高匹配效率,此处如何跳过尽可能多的字符串是本算法的核心思想。

举例:

在字符串this is a big city(母串)中查找city(字串)字符串

A

t

h

i

s

i

s

a

b

i

g

c

i

t

y

B

c

i

t

y

1.第一次查找

将字串与母串开始进行比较,结果显示不匹配。接下来按照sunday算法规则,将母串中的未与字串进行匹配的首个字符(即第五个字符)在字串中进行查找(在例子中即在B串中查找字符i)此时会出现两种情况,即找到和未找到,例子中的情况是找到,则将字串整个向后移动至两个i位置对齐,如图所示:

A

t

h

i

s

i

s

a

b

i

g

c

i

t

y

B

c

i

t

y

2.第二次查找

情况与第一次不同,在B串中没有找到字符b,因此直接将B串向后移动它自身长度的位数,移动后结果:

A

t

h

i

s

i

s

a

b

i

g

c

i

t

y

B

c

i

t

y

3.第三次查找

结果依然不匹配,但是在进行母串中的未与字串进行匹配的首个字符(即第五个字符)在字串中进行查找时出现了找到的情况,此时依据找到的字符移动字串,结果需要字串中的最右的该字符与母串中的字符位置相对应,结果如下图:

A

t

h

i

s

i

s

a

b

i

g

c

i

t

y

B

c

i

t

y

Java代码实现:

package Sunday;
/***@author JDK9*@date 2017-4-6*@description SunDay算法代码实现**/
public class SundayUtil {public String sunday(String sourse, String target) {String retVal="";char[] tempS = sourse.toCharArray();char[] tempT = target.toCharArray();int k=0;int j=0;if(compare(tempS,tempT,k,j)){retVal = "查找成功"; }else{retVal = "查找完成,未找到"; }return retVal;}/*** 对比主过程(递归调用)* @param tempS 源字符串* @param tempT 目标字符串* @param j 本次比较源字符串初始下标* @param k 同j* @return*/public boolean compare(char[] tempS, char[] tempT, int j, int k) {System.out.println("比较开始下标:"+k+"  "+j);for(int i=j;i<j+tempT.length;i++){if(tempT[i-j]==tempS[i]){k++;continue;}else{break;}}//k-j代表本次比较的次数,如果和目标字符串的长度相等,则说明每个字符都对比成功,即在源字符串中找到了目标字符串if(k-j==tempT.length){System.out.println("匹配成功");return true;}k=j+tempT.length;if(k<(tempS.length-1)){int value = check(tempS[k],tempT);int step = -value;j=k+step;return compare(tempS,tempT,j,j);}else{return false;}}/*** 检查目标字符串tempT是否包含c* @param c* @param tempT* @return*/public int check(char c, char[] tempT) {for(int i = tempT.length-1;i>=-1;i--){if(i==-1||tempT[i]==c){return i;}else{continue;}}return 0;}}

Sunday算法java实现相关推荐

  1. sunday java_SunDay算法java实现

    Sunday算法java实现 Sunday算法由Daniel M.Sunday在1990年提出,它的思想跟BM算法很相似: 只不过Sunday算法是从前往后匹配,在匹配失败时关注的是文本串中参加匹配的 ...

  2. Sunday算法介绍及Java实现

    前言 最初想写这篇文章的原因是在LeetCode上看到了一道实现strStr函数的题: 实现 strStr() 函数. 给定一个 haystack 字符串和一个 needle 字符串,在 haysta ...

  3. sunday算法特征码_Sunday算法介绍及Java实现

    前言 最初想写这篇文章的原因是在LeetCode上看到了一道实现strStr函数的题: 实现 strStr() 函数. 给定一个 haystack 字符串和一个 needle 字符串,在 haysta ...

  4. Java实现Sunday算法

    Sunday算法是Daniel M.Sunday于1990年提出的字符串模式匹配.其核心思想是:在匹配过程中,模式串发现不匹配时,算法能跳过尽可能多的字符以进行下一步的匹配,从而提高了匹配效率.相比于 ...

  5. 字符串匹配值Sunday算法

    实现strStr() 题目:实现 strStr() 实现 strStr() 函数.给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符 ...

  6. 字符串匹配算法(Sunday算法)

    Sunday算法: Sunday算法是Daniel M.Sunday于1990年提出的字符串模式匹配.其核心思想是:在匹配过程中,模式串发现不匹配时,算法能跳过尽可能多的字符以进行下一步的匹配,从而提 ...

  7. 字符串匹配算法之Sunday算法

    字符串匹配查找算法中,最着名的两个是KMP算法(Knuth-Morris-Pratt)和BM算法(Boyer-Moore).两个算法在最坏情况下均具有线性的查找时间.但是在实用上,KMP算法并不比最简 ...

  8. 字符串匹配--Sunday算法 1

    字符串匹配(查找)算法是一类重要的字符串算法(String Algorithm).有两个字符串, 长度为m的haystack(查找串)和长度为n的needle(模式串), 它们构造自同一个有限的字母表 ...

  9. 推特雪花算法 java实现

    2019独角兽企业重金招聘Python工程师标准>>> package twiter.snowflake;/*** twitter的snowflake算法 -- java实现*/ p ...

最新文章

  1. OSChina 周一乱弹 ——喝不到放心奶
  2. code ./打不开vscode编辑器
  3. [转载]智能科普:VR、AR、MR的区别
  4. 转载 ---资深HR告诉你:我如何筛选简历与选择人员的
  5. HugeGraph 多图配置
  6. 【MySQL】MySQL的帮助文档
  7. layuiadmin上手好难_孩子学什么乐器好?十种最受欢迎乐器的优劣势分析
  8. Authlib OAuth2.0
  9. 剑指Offer之整数中1出现的次数(从1到n整数中1出现的次数)
  10. 通过 Kubeflow 实例瞄准 Kubernetes 集群的密币挖掘攻击
  11. ES6深入浅出-1 新版变量声明:let 和 const-1.视频 概述
  12. 【dubbo源码解析】--- dubbo的服务暴露+服务消费(RPC调用)底层原理深入探析
  13. Java技术体系简介
  14. 温泉酒店加颜色透明matlab,通达信颜色透明代码,通达信,有条件的填充背景颜色,求源码...
  15. 【信息系统项目管理师】12项目合同管理
  16. 双卡4G路由器_4G双卡双模路由器_4G双网双待路由器
  17. 现代教育技术没有计算机基础知识教程,浅析现代教育技术在专科计算机基础课教学中的应用...
  18. 有什么免费的思维导图软件可以推荐?
  19. 实战Nagios NSCA方式监控Linux系统资源使用情况 -- Nagios配置篇 -- 被监控端
  20. 最贴近京东首页体验的嵌套滑动吸顶效果

热门文章

  1. #《算法竞赛入门经典》勘误
  2. SSL单向认证和双向认证交互流程
  3. Python通过MQTT协议上传物联网数据给ThingsBoard
  4. Android HashTable
  5. lattice FPGA 官网MIPI参考设计diamond编译报NGO不能展开,怎么解决?
  6. predict函数 R_超星尔雅-R语言学习总结(上)
  7. 必须得会的汽车ECU研发基础—软件开发流程6
  8. Android矢量图的制作
  9. 新一代AI人工智能机器学习研讨会即将在杭州举办,特聘叶梓老师主讲!
  10. 使用jQuery仿制网易云音乐移动端