写得比较马虎,欢迎大家指正。

直接看例子

首先初始化一个map,也可以用大小为256的int数组,数组中记录了较短字符串中字母出现的最后一个位置,如str = “abad” map[a] = 2, map[d] = 3
然后两个指针 i, j分别指向较长字符串,较短字符串,初始i=0,j=0。(记为l_str, s_str)
如果 l_str[i] = s_str[j] 则 i++,j++

如果 l_str[i] != s_str[j] 则看两个字符串第一个不重合的字符,这里就是a。index = 4。

然后根据前面的map,map中记录了这个字符最后出现的位置为2,根据这个值,我们可以将长字符串中的这个a和短字符串中最后出现的a对齐。然后更新i的值,j则为0

这里b!=a,看第一个不重合的字符。它的index = 6

然后又执行一次对齐操作。

接下来成功匹配3次一直执行i++,j++

当i = 7,j =3时匹配不成功 看第一个不重合的字符,它是b,然后去map中找b出现的最后一个位置。

对齐

匹配4次后成功。

结束。。。。

当然这个例子中没出现如果map中index指示的字符。看下面这种情况,
第一个没重合的字符时f,但是map中没有f的值,也就意味着短字符串中没有f这个字符,所以,设i = index +1

这里就没有对齐这个说法,直接往后跳。

简单的总结一下。
Sunday算法:
用map记录较短字符串中,每个字符出现的最后一个位置。
两个游标,i,j。初始为0。一个index指向往后数第一个未重合的字符。
1,当l_str[i] == s_str[j] i++,j++;
2, 不相等:
2.1:去map中找,如果有就把短的字符串中最后出现的它和index这个位置对齐。
2.2,如果没有,i = index+1

    public static int SundayMatch(String str,String patten){int len1=str.length();int len2=patten.length();int[] map=new int[256];for(int i=0;i<256;i++){map[i]=-1;}for(int i=0;i<len2;i++){//如果有相同的,保存最后出现的indexmap[patten.charAt(i)]=i;}for(int i=0;i<len1-len2;){int j=0;//每次跳完后j都是0while(j<len2){if(str.charAt(i)==patten.charAt(j)){i++;j++;}else{  //一遇到不匹配就往后跳int index=i+len2-j;//跳到不重合的第一个字符,index表示它的位置char p=str.charAt(index);if(map[p]==-1){   //如果str中没有这个字符i直接跳i=index+1;    }else {i=index-map[p];//对齐,把i移动到对齐后的位置}break;}}if (j == len2) {return i - len2;//匹配成功后j停留在尾端,和头相差len2的距离}}return -1;
}

Sunday算法流程与代码相关推荐

  1. MeanTeacher文章解读+算法流程+核心代码详解

    MeanTeacher 本博客仅做算法流程疏导,具体细节请参见原文 原文 原文链接点这里 Github 代码 Github代码点这里 解读 论文解读点这里 算法流程 代码详解 train_transf ...

  2. FixMatch文章解读+算法流程+核心代码详解

    FixMatch 本博客仅做算法流程疏导,具体细节请参见原文 原文 查看原文点这里 Github代码 Github代码点这里 解读 FixMatch算法抓住了半监督算法的两个重要观点,第一个是一致性正 ...

  3. 隐马尔科夫模型 (HMM) 算法介绍及代码实现

    Table of Contents Hidden Markov Model (隐马尔科夫模型) 定义 基本问题 前向算法 算法流程 实现代码 后向算法 算法流程 实现代码 Viterbi算法 算法流程 ...

  4. 写文件头的算法流程及C代码实现

    一.问题描述 将多条记录写入文件中,每条记录占一行.每写入一条记录,要计算当前文件中所有记录的大小(精确到字节)和记录条数,并写到文件的第一行(即文件头).为了便于区分,文件记录的大小和文件中记录条数 ...

  5. 体绘制(Volume Rendering)概述之4:光线投射算法(Ray Casting)实现流程和代码(基于CPU的实现)...

    转自:http://blog.csdn.net/liu_lin_xm/article/details/4850630 摘抄"GPU Programming And Cg Language P ...

  6. 【机器学习】K-Means算法的原理流程、代码实现及优缺点

    分类是根据样本某些属性或某类特征(可以融合多类特征),把样本类型归为已确定的某一类别中.机器学习中常见的分类算法有:SVM(支持向量机).KNN(最邻近法).Decision Tree(决策树分类法) ...

  7. 深入理解Sunday算法(附上C++代码)

    2.Sunday算法 Sunday算法与KMP算法一样是从前往后匹配,在匹配失败时关注的是主串中参加匹配的最末位的下一位字符. 如果该字符没有在模式串中出现则直接跳过,即移动位数=模式串长度+1: 否 ...

  8. 美颜sdk人脸美妆代码分析、算法流程

    美颜sdk人像美妆是非常重要的一个功能,目前深受广大用户喜爱,本篇文章小编将为大家讲解一下美颜sdk人像美妆功能的代码以及算法实现流程. 1.人像美妆算法流程 首先进行妆容模板制作,主要由Photos ...

  9. 【算法】从后向前的字符串匹配算法——BMH算法+sunday算法

    前言 KMP算法将从前向后的字符串匹配的效率发挥到了极致,所以想要进一步提升,只能打破思维定式,找到一条与众不同的路.所以从后往前的字符串匹配算法就应运而生.它可以更为高效的快速移动字符串,但是在最坏 ...

最新文章

  1. python pandas rename_使用Pandas重命名文件
  2. python判断变量不为空_Python简洁方法
  3. 最大的100家外包公司(zz.IS2120@BG57IV3)
  4. Android系统架构基本模式解析
  5. 职场宝典:63种能力让你职场步步高升
  6. 代码重构----使用java有限状态机来消除太多的if else判断
  7. bseg---faglflexta
  8. Windows Mobile开发应该选择哪种开发语言?
  9. 威纶通触摸屏与mysql_威纶触摸屏应用实例 以及威纶通触摸屏配方组合
  10. hdf5 matlab,通过MATLAB将矩阵数据写入HDF5文件中的每个数据类型成员
  11. 有这几个编程利器网站,再也不愁学习
  12. JS根据分数,计算名次(分数相同名次相同)
  13. 【Linux】系统移植篇一--linux系统移植导学
  14. Mac AE2018软件安装及破解
  15. 用python编写倒计时_python如何倒计时
  16. qq安全保护进程更改计算机,QQ安全中心
  17. JNDI注入学习(看不懂直接喷,别忍着!)
  18. 银行项目外包专题系列之二:公司没提升打杂,裸辞后收到银行外包,到底去还是不去
  19. C语言基础知识讲解(入门)
  20. 各种类型相机rtsp取流格式大汇总

热门文章

  1. 网络编程 正则表达式
  2. anchor机制讲解
  3. 计算机一级考试内容有哪些?
  4. PHP借用Redis消息队列实现高并发下发送邮件功能
  5. 使用chart.js 制作图表
  6. Hbase集群搭建超详细教程
  7. NeXT,NEXTSTEP,OPENSTEP,Cocoa,Cocoa Touch,GNUstep,xcode
  8. 2004年9月30日星期三
  9. MATLAB学习笔记-IEEE802.16d模型
  10. 五大常用算法——分治算法详解及经典例题