蓝桥杯算法基础(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/787930.shtml

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

相关文章

Leetcode 322. 零钱兑换

心路历程&#xff1a; 这道题和上一道完全平方数的和基本上一摸一样&#xff0c;甚至比上一道题还简单&#xff0c;基于dp的建模&#xff1a; 状态&#xff1a;当前的目标总金额 动作&#xff1a;选哪一个硬币 返回值&#xff1a;凑成该目标总金额的最少硬币个数 这道题如果硬…

2024.4.2

模拟面试&#xff1a; 一、GPIO是什么&#xff1f; 答&#xff1a;通用输入输出接口&#xff0c;可以作为单片机和外部设备连接的桥梁。 二、VCC是什么? VCC通常是多少V? 答&#xff1a;电源&#xff0c;通常是3.3V和5V。 三、FreeRTOS任务有几种状态&#xff0c;分别是…

MATLAB科研绘图与学术图表绘制从入门到精通

&#x1f482; 个人网站:【 摸鱼游戏】【神级代码资源网站】【工具大全】&#x1f91f; 一站式轻松构建小程序、Web网站、移动应用&#xff1a;&#x1f449;注册地址&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交…

二轮电动自行车充电桩开源系统

文章目录 一、产品功能部分截图1.手机端&#xff08;小程序、安卓、ios&#xff09;2.PC端 二、小程序体验账号以及PC后台体验账号1.小程序体验账号2.PC后台体验账号关注公众号获取最新资讯 三、产品简介&#xff1f;1. 充电桩云平台&#xff08;含硬件充电桩&#xff09;&…

`@Autowired`

Autowired 是Spring框架中的一个注解&#xff0c;用于实现依赖注入。当你在一个类的字段、构造函数或方法上使用Autowired注解时&#xff0c;Spring容器会在创建该类实例的过程中自动寻找匹配的bean&#xff0c;并将其注入到相应的位置。 这里是Autowired注解的一些使用场景和…

【xinference】(8):在autodl上,使用xinference部署qwen1.5大模型,速度特别快,同时还支持函数调用,测试成功!

1&#xff0c;关于xinference Xorbits Inference (Xinference) 是一个开源平台&#xff0c;用于简化各种 AI 模型的运行和集成。借助 Xinference&#xff0c;您可以使用任何开源 LLM、嵌入模型和多模态模型在云端或本地环境中运行推理&#xff0c;并创建强大的 AI 应用。 Xor…

外部工具包不要依赖服务的环境变量

1. 前言 虽然这周才过去一天&#xff0c;但自己真的是被bug围住了&#xff0c;果然程序员每天的工作就是在写bug<->解决bug中无限循环。今天遇到了之前给项目写的一个工具包的bug&#xff0c;这个工具包因为需要抽出来给到其他组使用&#xff0c;所以抽成了类工具包的一…

互联网、因特网、万维网的区别

互联网 internet&#xff1a;凡是能彼此通信的设备组成的网络就叫互联网&#xff0c;即使只有两台计算机&#xff0c;无论以何种技术使其彼此通信&#xff0c;都叫互联网。所以&#xff0c;根据互联网的覆盖规模可以分为&#xff1a; 局域网&#xff08;Local Area Network&am…

初学者必看!Python wtforms库让你轻松创建和验证Web表单

1. 什么是WTForms 库? WTForms 是一个 Python 库&#xff0c;用于在 Web 应用程序中创建和验证表单。它提供了一个简单的接口来定义表单字段和验证规则&#xff0c;并将它们呈现为 HTML 表单。WTForms 支持多种 Web 框架&#xff0c;包括 Flask、Django 和 Pyramid。 2. 核心…

NSSCTF Round#20 Basic 真亦假,假亦真 CSDN_To_PDF V1.2 出题笔记 (附wp+源码)

真亦假&#xff0c;假亦真 简介&#xff1a;java伪造php一句话马。实则信息泄露一扫就出&#xff0c;flag在/flag里面。 题目描述&#xff1a;开开心心签个到吧&#xff0c;祝各位师傅们好运~ 静态flag&#xff1a;NSS{Checkin_h4v3_4_g00D_tINNe!} /路由显示 <?php e…

【MyBatis】MyBatis的日志实现

目录 一、日志演变 二、MyBatis中实现日志管理 1.导入pom依赖 2.添加logback配置文件 3.日志打印 三、MyBatis日志技术实现原理 3.1 初始化 3.2 具体实现类 3.3 自己模拟实现mybaits的日志实现 四、架构系统如何考虑日志 一、日志演变 JDK 1.4之前 没有任何的日志框…

vue 移动端弹窗带滚动效果 滚动到底的时候弹窗下的页面会跟着滑动

<template><div class"wrap" :style"dynamicStyle"><!--dynamicStyle主要是介个 通过computed设置postion的值 弹窗的时候设置为fixed 关闭弹窗的时候设置为unset--><div class"banner-wrap"><img src"/assets/…

16.Python多线程

如果想让我们的程序同时执行多个任务&#xff0c;就需要使用多线程技术了 。到目前为止&#xff0c;我们编写的程序都是单线程的&#xff0c;在运行时一次只能执行 一个任务。 1 线程相关的知识 1.1 进程 一个进程就是一个正在执行的程序&#xff0c;每一个进程都有自己独立…

sklearn主成分分析PCA

文章目录 基本原理PCA类图像降维与恢复 基本原理 PCA&#xff0c;即主成分分析(Principal components analysis)&#xff0c;顾名思义就是把矩阵分解成简单的组分进行研究&#xff0c;而拆解矩阵的主要工具是线性变换&#xff0c;具体形式则是奇异值分解。 设有 m m m个 n n …

Linux内存管理 —— 通过实验学习和理解CoW(2)

文章目录 作者环境概述正文父进程执行fork时将可写的页面设置成只读copy_mmdup_mmdup_mmapcopy_page_range父进程首先写时,触发CoWhandle_pte_faultdo_wp_pagewp_page_copy子进程随后在写时触发缺页作者 pengdonglin137@163.com 环境 Linux-6.5 + ARM64 概述 前一篇通过实…

Rust---有关介绍

目录 Rust---有关介绍变量的操作Rust 数值库&#xff1a;num某些基础数据类型序列(Range)字符类型单元类型 发散函数表达式&#xff08;&#xff01; 语句&#xff09; Rust—有关介绍 得益于各种零开销抽象、深入到底层的优化潜力、优质的标准库和第三方库实现&#xff0c;Ru…

蚁剑流量分析

蚁剑流量分析 在靶机上面上传一个一句话木马&#xff0c;并使用蚁剑连接&#xff0c;进行抓包, 一句话木马内容 <?php eval($_POST[1]); defalut编码器 在使用蚁剑连接的时候使用default编码器 连接之后进行的操作行为是查看当前目录(/var/www/html)下的文件&#xff0…

数据结构进阶篇 之 【插入排序】详细讲解(直接插入排序,希尔排序)

千万不要因为一件事不会做而失去信心&#xff0c;你又不是只有这一件事不会&#xff0c;你还有很多呢 一、插入排序 1.直接插入排序 InsertSort 1.1 基本思想 1.2 实现原理 1.3 代码实现 1.4 直接插入排序的特性总结 2.希尔排序 ShellSort 2.1 基本思想 2.2 实现原理 …

Sora 基础作品之 DiT:Scalable Diffusion Models with Transformer

Paper name Scalable Diffusion Models with Transformers (DiT) Paper Reading Note Paper URL: https://arxiv.org/abs/2212.09748 Project URL: https://www.wpeebles.com/DiT.html Code URL: https://github.com/facebookresearch/DiT TL;DR 2022 年 UC Berkeley 出…

罗克韦尔AB的PLC协议和西门子PLC协议转换网关

下面是罗克韦尔(AB)的Compact系列的PLC与西门子S7-1500之间的通讯的配置&#xff0c;实现AB的标签数组与西门子DB数据块之间通讯。 首先在AB的PLC内建立输入和输出数组&#xff0c;用于接收和写入S7-1500的PLC数据&#xff0c;名称分别是IN_INT16、OUT_OUT16&#xff0c;输入80…