Sunday算法流程与代码
写得比较马虎,欢迎大家指正。
直接看例子
首先初始化一个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算法流程与代码相关推荐
- MeanTeacher文章解读+算法流程+核心代码详解
MeanTeacher 本博客仅做算法流程疏导,具体细节请参见原文 原文 原文链接点这里 Github 代码 Github代码点这里 解读 论文解读点这里 算法流程 代码详解 train_transf ...
- FixMatch文章解读+算法流程+核心代码详解
FixMatch 本博客仅做算法流程疏导,具体细节请参见原文 原文 查看原文点这里 Github代码 Github代码点这里 解读 FixMatch算法抓住了半监督算法的两个重要观点,第一个是一致性正 ...
- 隐马尔科夫模型 (HMM) 算法介绍及代码实现
Table of Contents Hidden Markov Model (隐马尔科夫模型) 定义 基本问题 前向算法 算法流程 实现代码 后向算法 算法流程 实现代码 Viterbi算法 算法流程 ...
- 写文件头的算法流程及C代码实现
一.问题描述 将多条记录写入文件中,每条记录占一行.每写入一条记录,要计算当前文件中所有记录的大小(精确到字节)和记录条数,并写到文件的第一行(即文件头).为了便于区分,文件记录的大小和文件中记录条数 ...
- 体绘制(Volume Rendering)概述之4:光线投射算法(Ray Casting)实现流程和代码(基于CPU的实现)...
转自:http://blog.csdn.net/liu_lin_xm/article/details/4850630 摘抄"GPU Programming And Cg Language P ...
- 【机器学习】K-Means算法的原理流程、代码实现及优缺点
分类是根据样本某些属性或某类特征(可以融合多类特征),把样本类型归为已确定的某一类别中.机器学习中常见的分类算法有:SVM(支持向量机).KNN(最邻近法).Decision Tree(决策树分类法) ...
- 深入理解Sunday算法(附上C++代码)
2.Sunday算法 Sunday算法与KMP算法一样是从前往后匹配,在匹配失败时关注的是主串中参加匹配的最末位的下一位字符. 如果该字符没有在模式串中出现则直接跳过,即移动位数=模式串长度+1: 否 ...
- 美颜sdk人脸美妆代码分析、算法流程
美颜sdk人像美妆是非常重要的一个功能,目前深受广大用户喜爱,本篇文章小编将为大家讲解一下美颜sdk人像美妆功能的代码以及算法实现流程. 1.人像美妆算法流程 首先进行妆容模板制作,主要由Photos ...
- 【算法】从后向前的字符串匹配算法——BMH算法+sunday算法
前言 KMP算法将从前向后的字符串匹配的效率发挥到了极致,所以想要进一步提升,只能打破思维定式,找到一条与众不同的路.所以从后往前的字符串匹配算法就应运而生.它可以更为高效的快速移动字符串,但是在最坏 ...
最新文章
- python pandas rename_使用Pandas重命名文件
- python判断变量不为空_Python简洁方法
- 最大的100家外包公司(zz.IS2120@BG57IV3)
- Android系统架构基本模式解析
- 职场宝典:63种能力让你职场步步高升
- 代码重构----使用java有限状态机来消除太多的if else判断
- bseg---faglflexta
- Windows Mobile开发应该选择哪种开发语言?
- 威纶通触摸屏与mysql_威纶触摸屏应用实例 以及威纶通触摸屏配方组合
- hdf5 matlab,通过MATLAB将矩阵数据写入HDF5文件中的每个数据类型成员
- 有这几个编程利器网站,再也不愁学习
- JS根据分数,计算名次(分数相同名次相同)
- 【Linux】系统移植篇一--linux系统移植导学
- Mac AE2018软件安装及破解
- 用python编写倒计时_python如何倒计时
- qq安全保护进程更改计算机,QQ安全中心
- JNDI注入学习(看不懂直接喷,别忍着!)
- 银行项目外包专题系列之二:公司没提升打杂,裸辞后收到银行外包,到底去还是不去
- C语言基础知识讲解(入门)
- 各种类型相机rtsp取流格式大汇总