蓝桥杯算法基础(30):尺取法的应用(hiho字符串),next数组应用(前缀周期性)

 

尺取法应用题hiho字符串

 

如果一个字符串恰好包含2个'h',1个‘1’和1个‘0’,我们就称这个字符串是hiho字符串
例如"oihateher"、“hugeinputhugeoutput”都是hiho字符串
现在给定一个只包含小写字母的字符串S,小H想知道S的所有子串中,最短的hiho字符串是哪个punlic static void solve2(char[] w){int min=Integer.MAX_VLUE;int j=-1;for(int i-=0;i<w.length;i++){char c=w[i];if(check(c)){//i停下if(j==-1){//j的第一次定位j=i+1;}while(j<w.length){char c2=w[j];if(check(c2)&&containsAll(w,i,j)){//c2是否为关键字,且全部囊括2个h,1个i,1个oif(check(w,i,j)&&j-i+1<min)//恰好包含,且更新minmin=j-i+1;}break;//j停下}j++;//j继续扫描}}System.out.println(min==Integer.MAX_VALUE?-1:min);
}//检查字符序列是否恰好包含2个h一个i和一个oprivate static boolean check(char[] w,int i,int j){int c1=0,c2=0.c3=0;for(int k=i;k<=j;j++){if(w[k]=='h')c1++;if(w[k]=='i')c2++;if(w[k]=='o')c3++;}return c1==2&&c2==1&&c3==1;
}private static boolean check(char c){return c=='h'||c=='i'||c=='o';}private static boolean containsAll(char[] w.int i,int j) {int c1=0;c2=0,c3=0;for(int k=i;k<=j;k++){if(w[k]=='h')c1++;if(w[k]=='i')c2++;if(w[k]=='o')c3++;}return c1>=2&&c2>=1&&c3>=1;}

next数组应用前缀周期性

前缀是否为周期性的,如果是周期性的,输出前缀的下标和周期重复次数
3
aaa
12
aabaabaabaab
02 2
3 32 2
6 2
9 3
12 4next[j]=k;
k%(j-k)=0则证明串为周期性的
j/(j-k)则是循环的次数public static void main(){Scanner sc=new Scanner(System.in);List<String> list =new ArrayList<String>();//定义一个线性表int caseNum=1;while(true){int n=sc.next();//输入字符串的数量if(n==0){break;}String s=sc.next();//输入字符串list.add(s);//将字符串加入线性表}for(int j=0;j<list.size();j++){String s=list.get(j);//拿出一个字符串//int len=s.length();int[] next=next(s);System.out.println("Test case #"+(j+1));boolean flag=false;for(int i=2;i<next.length;i++){//挨个依次遍历,找next看是否满足(j-k)%k=0int k=next[i];//找nextint t=i-k;if(i%t==0&&i/t>1){//若是k等于0,,i%(i-k)同样等于0,所以还要满足i/t>1System.out.println(i+" "+i/t);//i/(i-k)为循环体的次数}}System.out.println();}
}

 

后缀数组的应用

后缀数组+高度数组
-最长重复子串(可重复或者说可交叉)
-不可重复的最长重复子串
-可重叠并且出现至少k次的最长子串-最长重复子串(可重复或者说可交叉)
1123232323452323232345
23232345------->6
两个后缀的前缀相同,这个叫做重复public static int maxRepeatSubString(String src){Match03_SuffixArray.suff[] sa=Match03_suffixArray.getSa2(src);int[] height =Match03_SuffixArray.getHeight(src,sa);int maxHeight=0;int maxIndex=-1;for(int i=0;i<height.length;i++){if(height[i]>maxHeight){maxHeight=height[i];maxIndex=i;}}int index=sa[maxindex].index;//转成原始下标Syste.out.println(src.substring(index,index+maxHeight));return maxHeight;
}-不可重复的最长重复子串
//二分枚举+height分组
最大高度的两个字符串在后缀数组中的原始下标,且两个下标之差,大于等于两个字符串的最大公共前缀//用length将height分组,小于组和大于等于组交替
//在大于组中更新最大最小原始下标,大转小的时候检查上一个大于组是否满足不重叠
//在小于族中,只需持续地将原始下标赋给max和min,这样小转大的时候,可以保留小于组最后一个元素地小标public static boolean check(int[] height,Match03_SuffixArray,Suff[] sa,int len){int minIndex=sa[0].index;int minIndex=sa[0].index;//maxIndex:5for(int i=1;i<height.length;i++){//i:5int index=sa[i].index;//index:8 sa:Match03_SuffixArraySuff[9] 613if(height[i]>=len){//lcp大于len height:{0 0 2 4 6 0 1 3 5} i: 5minIndex=min(minIndex,index);//小转大maxIndex=max(maxIndex,index);}else{//大转小if(maxIndex-minIndex>=len){//maxIndex:5 minIndex:1 len:4return true;}maxIndex=index;minIndex=index;}}
}public static int maxRepeatSubString2(String src){Match03_SuffArray.Suff[] sa=Match03_SuffixArray.getSa2(src);int l=0;int r=height.length;int ans=0;while(l<=r){int mid=l+((r-l)>>1);//chech的重叠长度if(check(height,sa,mid)){if(mid=height.length/2){return mid;}l=mid+1;ans=mid;}else{r=mid-1;}}return ans;}public static int maxRepeatSubString(String src){Match03_SuffixArray.suff[] sa=Match03_suffixArray.getSa2(src);int[] height =Match03_SuffixArray.getHeight(src,sa);int maxHeight=0;int maxIndex=-1;for(int i=0;i<height.length;i++){if(height[i]>maxHeight){int index=sa[i].index;//转成原始下标int index1=sa[i-1].index;//转成原始下标if(Math.abs(index-index1)>=height[i]){maxHeight=height[i];maxIndex=i;}}}int index=sa[maxindex].index;//转成原始下标Syste.out.println(src.substring(index,index+maxHeight));return maxHeight;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/774218.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于单片机防酒驾酒精检测报警系统装置设计

**单片机设计介绍&#xff0c;基于单片机防酒驾酒精检测报警系统装置设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机防酒驾酒精检测报警系统装置的设计旨在通过单片机技术和酒精传感器&#xff0c;实现对驾驶员酒…

labelme自动标注工具的安装和python代码修改

labelme嵌入SAM和EfficientSAM自动标注模型 目录: 1.labelme windows环境下安装python版本labelme 2.labelme.exe直接安装 3.labelme生成exe 4.labelme python代码修改 labelme自动标注使用方法 编辑/Create AI-Polygon 自动分割,直接生成分割图,标注为point,完成标注后…

【WiFi】WiFi QoS映射关系及抓包分析

WiFi Aliance认证测试对应图 RFC8325 ​​​​​​RFC 8325https://datatracker.ietf.org/doc/html/rfc8325 RFC 8325 – WiFi QoS Mappings | mrn-cciew (mrncciew.com)https://mrncciew.com/2021/09/14/rfc-8325-wifi-qos-mappings/ 802.11 UP和DSCP映射关系 802.11 UP …

大数据Hadoop入门04 ——【HDFS shell操作】

一、HDSF shell命令行解释说明 1、介绍 命令行界面&#xff08;英语: command-line interface&#xff0c;缩写: CLl)&#xff0c;是指用户通过键盘输入指令&#xff0c;计算机接收到指令后&#xff0c;予以执行一种人际交互方式。Hadoop提供了文件系统的shell命令行客户端:…

使用Flask和Gunicorn部署Python Web应用到生产环境

简介 本文将指导您如何使用Flask框架和Gunicorn WSGI服务器,将一个Python Web应用部署到生产环境。我们将从创建一个简单的Flask应用开始,然后介绍如何使用Gunicorn进行部署,并最后简要讨论部署到生产环境时的一些最佳实践。 准备您的Flask应用 首先,确保您的Flask应用已…

设置http响应报文

一、总结&#xff1a; (1)设置响应状态码&#xff1a; response.statusCode (2)设置响应状态描述&#xff1a; response.statusMessage() 使用的极少 (3)设置响应头信息&#xff1a; response.setHeader(头值,头名) (4)设置响应体&#xff1a; response…

28位驻华大使、公使参访苏州金龙 点赞刚刚全球发布的新V系大巴

3月26日下午&#xff0c;由外交部组织的“驻华使节团参访江苏”活动走进苏州金龙。来自28个国家和国际组织的驻华大使、公使参观了苏州金龙展厅&#xff0c;并试乘体验了苏州金龙全新V系大巴。外交部中国政府欧洲事务特别代表吴红波&#xff0c;外交部礼宾司、翻译司、非洲司、…

2024游泳耳机哪个牌子好?分析测评四大热门游泳耳机

随着科技的不断发展&#xff0c;游泳耳机已经成为游泳爱好者们在水中畅游时的最佳伴侣。近年来游泳耳机市场涌现出了众多品牌和产品&#xff0c;让人眼花缭乱。为了帮助大家挑选到最适合自己的游泳耳机&#xff0c;我们特意对市面上四大热门游泳耳机进行了详细的分析测评&#…

手把手教你绘画原型图:Axure的安装使用

&#x1f341; 作者&#xff1a;知识浅谈&#xff0c;CSDN签约讲师&#xff0c;CSDN博客专家&#xff0c;华为云云享专家&#xff0c;阿里云专家博主 &#x1f4cc; 擅长领域&#xff1a;全栈工程师&#xff0c;大模型&#xff0c;爬虫、ACM算法 &#x1f492; 公众号&#xff…

jenkins权限分配

1.安装权限插件 Role-Based Strategy 2.创建用户 3.修改全局安全配置中的授权策略为Role-Based Strategy 4.进入Manage and Assign Roles创建Global roles和Item roles 4.进入Assign Roles给用户分配role

AIGC——ComfyUI SDXL多种风格预设提示词插件安装与使用

概述 SDXL Prompt Styler可以预先给SDXL模型提供了各种预设风格的提示词插件&#xff0c;相当于预先设定好了多种不同风格的词语。使用这个插件&#xff0c;只需从中选取所需的风格&#xff0c;它会自动将选定的风格词汇添加到我们的提示中。 安装 插件地址&#xff1a;http…

【Redis】快速入门 数据类型 常用指令 在Java中操作Redis

文章目录 一、简介二、特点三、下载与安装四、使用4.1 服务器启动4.2 客户端连接命令4.3 修改Redis配置文件4.4 客户端图形化界面 五、数据类型5.1 五种常用数据类型介绍5.2 各种数据类型特点 六、常用命令6.1 字符串操作命令6.2 哈希操作命令6.3 列表操作命令6.4 集合操作命令…

09 mybatis 注解

文章目录 products.sqlpom.xmlmybatis-config.xmlProductsMapper.xmlProducts.javaPhoneDto.javaProductsMapper.javaDButil.javaProductsMapperTest products.sql create table products (product_id int auto_increment comment 产品IDprimary key,product_name va…

Java_17 两数之和

两数之和 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一个元素在答案里不能重复出现。 你可以按任…

Day35 ● 860.柠檬水找零 ● 406.根据身高重建队列 ● 452. 用最少数量的箭引爆气球

● 860.柠檬水找零 class Solution:def lemonadeChange(self, bills: List[int]) -> bool:fiveten0for bill in bills:if bill5:five1elif bill10:five-1ten1elif bill20 and ten!0:five-1ten-1else:five-3if five<0:return Falsereturn True ● 406.根据身高重建队列 cl…

光伏百科|分布式光伏电站如何开展运维管理工作?

随着经济的不断发展和生活水平的日益提高&#xff0c;节能环保已经成为全社会的责任和共识&#xff0c;分布式光伏电站作为清洁能源走进了千家万户。然而&#xff0c;在分布式光伏电站运行期间&#xff0c;面临监管困难、系统繁多、火灾隐患和运维不当等困难&#xff0c;该如何…

EasyExcel Converter实现java对象和excel单元格转换

在EasyExcel中&#xff0c;Converter接口用于定义如何在Java对象和Excel单元格之间进行转换。 也就是说EasyExcel可以根据数据库中的值来填充Excel中对应的文本内容。 比如数据库1,2,3可以填充到excel中&#xff1a;男&#xff0c;女&#xff0c;其他 使用easyExcel的之前&a…

推特社交机器人分类

机器人有不同的种类。 cresci-17数据集中的三种不同的机器人类:传统垃圾机器人、社交垃圾机器人和假追随者。 传统的垃圾邮件机器人会生成大量推广产品的内容&#xff0c;并且可以通过频繁使用的形容词来检测; 社交垃圾邮件倾向于攻击或支持政治候选人&#xff0c;因此情绪是一…

leetcode每日一题 2580 统计将重复区间合并成组的方案数

给你一个二维整数数组 ranges &#xff0c;其中 ranges[i] [starti, endi] 表示 starti 到 endi 之间&#xff08;包括二者&#xff09;的所有整数都包含在第 i 个区间中。 你需要将 ranges 分成 两个 组&#xff08;可以为空&#xff09;&#xff0c;满足&#xff1a; 每个区…

变位词,java代码实现

需求 需求&#xff1a;检查两个词是否是“变为词”&#xff08;变位词&#xff1a;两个词是有相同的字母不同的排序组成&#xff0c;例如&#xff1a;earth和heart&#xff0c;python和typhon&#xff09;输入&#xff1a;两个单词输出&#xff1a;0或者1&#xff0c;0&#x…