华为OD机考算法题:字符串解密
目录
题目部分
解读与分析
代码实现
题目部分
题目 | 字符串解密 |
题目说明 | 给定两个字符串string1和string2。 string1是一个被加扰的字符串。string1由小写英文字母('a'~'z')和数字字符('0'~'9')组成,而加扰字符串由'0'~'9'、'a'~'f' 组成。string1里面可能包含0个或多个加扰子串,剩下可能有0个或多个有效子串,这些有效子串被加扰子串隔开。 string2是一个参考字符串,仅由小写英文字母('a'~'z')组成。 你需要在string1字符串里找到一个有效子串,这个有效子串要同时满足下面两个条件: (1)这个有效子串里不同字母的数量不超过且最接近于string2里不同字母的数量,即小于或等于string2里不同字母的数量的同时且最大。 (2)这个有效子串是满足条件(1)里的所有子串(如果有多个的话)里字典序最大的一个。 如果没有找到合适条件的子串的话,请输出"Not Found"。 示例: 输入字符串string1为"thisisanewday111forme",输入字符串string2为"good"。string1里有效子串和加扰子串分割后可表示为:"thisis"+"a"+"n"+"e"+"w"+"da"+"y"+"111f"+"orm"+"e",去除加扰子串("a"、"e"、"da"、"111f"、"e")后的有效子串候选为("thisis", "n", "w", "y", "orm")。输入字符串string2里不同字母的数量为3('g'、'o'、'd'),从有效子串候选里可以找出"orm"满足要求,其不同字母的数量为3,最接近于string2不同字母的数量。 |
输入描述 说明 | input_string1 input_string2 输入为两个字符串,第1行是题目里的string1(被加扰的字符串),第2行是题目里的string2(参考字符串)。 |
输出描述 说明 | output_string 输出为一个字符串(有效字符串)。 |
补充说明 | 输入字符串string1的长度在1~100000之间,string2的长度在1~500之间。 |
------------------------------------------------------ | |
示例 | |
示例1 | |
输入 | 123admyffc79pt ssyy |
输出 | pt |
说明 | 将输入字符串1里的加扰子串"123ad"、"ffc79"去除后得到有效子串序列:"my"、"pt",其中"my"里不同字母的数量为2(有'm'和'y'两个不同字母),"pt"里不同字母的数量为2(有'p'和't'两个不同字母);输入字符串2里不同字母的数量为2(有's'和'y'两个不同字母)。 可得到最终输出结果为"pt",其不同字母的数量最接近于"ssyy"里不同字母的数量的同时字典序最大。 |
示例2 | |
输入 | 123admyffc79ptaagghi2222smeersst88mnrt ssyyfgh |
输出 | mnrt |
说明 | 将输入字符串1里的加扰子串"123ad"、"ffc79"、"aa"、"2222"、"ee"、"88"去除后得到有效子串序列:"my"、"pt"、"gghi"、"sm"、"rsst"、"mnrt";输入字符串2里不同字母的数量为5(有's'、'y'、'f'、'g'、'h' 5个不同字母)。 可得到最终输出结果为"mnrt",其不同字母的数量(为4)最接近于"ssyyfgh"里不同字母的数量,其他有效子串不同字母的数量都小于"mnrt"。 |
示例3 | |
输入 | abcmnq rt |
输出 | Not Found |
说明 | 将输入字符串1里的加扰子串"abc"去除后得到有效子串序列:"mnq";输入字符串2里不同字母的数量为2(有'r'、't'两个不同的字母)。 可得到最终的输出结果为"Not Found",没有符合要求的有效子串,因有效子串的里不同字母的数量(为3),大于输入字符串2里的不同字母的数量。 |
解读与分析
题目解读:
本题有 2 行输入,第一行输入字符串的字符中字符的范围是 'a'~'z' 和 '0' ~ '9',在输入字符串中,如果字符范围在 'a'~'f' 或 '0' ~ '9' 中,那么这些字符是干扰字符,可以理解为间隔符。这些间隔符把源字符串分割成了多个字符串。
第二行输入一个字符串,统计出这个字符串中出现的唯一字符串个数,设为 max,即当同一个字母出现多次时只计算一次。
从第一行分隔出的多个字符串中,过滤掉不同字母数大于 max 的字符串。在剩下的字符串中,找出不同字母数最大的字符串,如果字符串是唯一的,输出它;如果不同字母数最大的字符串存在多个,输出字典序最大的那个;如果不存在符合条件的字符串,则输出 "Not Found"。
分析与思路:
先设置 3 个变量:
1. max,整形变量。用于统计第二行输入字符串的唯一字符个数。
2. currentMax,整形变量,初始值为 0。在遍历过程中,用于统计在分隔字符串时,记录不同字母数不大于 max 的最大个数。
3. output,字符串长度,初始值为 "Not Found"。
算法如下:
1. 遍历第二行字符串中的字母,把所有字符放到一个 set 中,最后统计 set 中元素的个数,赋值给 max。
为什么要先计算 max 值呢?因为这样做可以减少统计的工作量。
先遍历第二行字符串,在计算出 max 值之后,再遍历第一行字符串时,可以直接忽略掉分隔后长度大于 max 的字符串。否则,需要先统计分隔后的所有字符串(无论长度是多少),最后还是要过滤掉长度大于 max 的字符串,多了些不必要的工作量。
2. 遍历第一行字符串中的字母,根据干扰字母(分隔符),把它分隔成若干字符串。对于遍历过程中的每个字符串,进行如下操作:
① 如果此字符串的不同字母数大于 max,则舍弃它。
② 如果此字符串的不同字母数小于 currentMax,舍弃它。
③ 如果此字符串的不同字母数大于 currentMax,把此字符串不同字母数赋值给 currentMax,并把此字符串赋值给 output。
④ 如果此字符串的不同字母数等于 currentMax,比较此字符串与 output 的字典序大小,如果此字符串的字典序较大,则更新 output 的值为此字符串。
3. 遍历完字第一行字符串后,输出 output。
此算法只需要遍历一次字符串,时间复杂度为 o(n)。在遍历过程中,仅需要 3 个临时变量,空间复杂度为 o(1)。
代码实现
Java代码
import java.util.Scanner;
import java.util.Set;
import java.util.Arrays;
import java.util.HashSet;/*** 字符串解密* * @since 2023.09.07* @version 0.1* @author Frank**/
public class StringDecrypt {public static void main(String[] args) {Scanner sc = new Scanner(System.in);while (sc.hasNext()) {String firstLine = sc.nextLine();String secondLine = sc.nextLine();processStringDecrypt(firstLine, secondLine);}}private static void processStringDecrypt(String firstLine, String secondLine) {int max = getUniqueCount(secondLine);int currentMax = 0;String output = "Not Found";Character[] fiterChars = { 'a', 'b', 'c', 'd', 'e', 'f', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };Set<Character> filterSet = new HashSet<Character>(Arrays.asList(fiterChars));int i = 0;while (i < firstLine.length()) {Character first = firstLine.charAt( i );if( filterSet.contains( first ) ){i ++;continue;}int leftIndex = i;int rightIndex = i; // 不包含Character iterChar = firstLine.charAt( i );while( !filterSet.contains( iterChar )){i ++;if( i >= firstLine.length() ){rightIndex = i;break;}iterChar = firstLine.charAt( i );}rightIndex = i;String subStr = firstLine.substring( leftIndex, rightIndex );int subStrUniCnt = getUniqueCount( subStr );if( subStrUniCnt == 0 || subStrUniCnt < currentMax || subStrUniCnt > max ){continue;}if( subStrUniCnt > currentMax ){currentMax = subStrUniCnt;output = subStr;continue;}// subStrLength == currentMaxif( output.compareTo( subStr ) < 0 ){output = subStr;continue;}}System.out.println(output);}private static int getUniqueCount(String secondLine) {Set<Character> charSet = new HashSet<Character>();for (int i = 0; i < secondLine.length(); i++) {charSet.add(secondLine.charAt(i));}return charSet.size();}}
JavaScript代码
const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;
void async function() {while (line = await readline()) {var firstLine = line;var secondLine = await readline();processStringDecrypt(firstLine, secondLine);}}();function processStringDecrypt(firstLine, secondLine) {var max = getUniqueCount(secondLine);var currentMax = 0;var output = "Not Found";var filterSet = new Set(['a', 'b', 'c', 'd', 'e', 'f', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9']);var i = 0;while (i < firstLine.length) {var first = firstLine.charAt(i);if (filterSet.has(first)) {i++;continue;}var leftIndex = i;var rightIndex = i; // 不包含var iterChar = firstLine.charAt(i);while (!filterSet.has(iterChar)) {i++;if (i >= firstLine.length) {rightIndex = i;break;}iterChar = firstLine.charAt(i);}rightIndex = i;var subStr = firstLine.substring(leftIndex, rightIndex);var subStrUniCnt = getUniqueCount(subStr);if (subStrUniCnt == 0 || subStrUniCnt < currentMax || subStrUniCnt > max) {continue;}if (subStrUniCnt > currentMax) {currentMax = subStrUniCnt;output = subStr;continue;}// subStrLength == currentMaxif (output < subStr) {output = subStr;continue;}}console.log(output);
}function getUniqueCount(secondLine) {var charSet = new Set();for (var i = 0; i < secondLine.length; i++) {charSet.add(secondLine.charAt(i));}return charSet.size;
}
(完)
相关文章:
![](https://www.ngui.cc/images/no-images.jpg)
华为OD机考算法题:字符串解密
目录 题目部分 解读与分析 代码实现 题目部分 题目字符串解密题目说明给定两个字符串string1和string2。 string1是一个被加扰的字符串。string1由小写英文字母(a~z)和数字字符(0~9)组成,而加扰字符串由0~9、a~f 组…...
![](https://img-blog.csdnimg.cn/5efab64d9a63488eb93a302ac415a15b.png)
unity 锚点设置
锚点聚合情况: 一个2d物体的位置 pos x pos y 是中心点相对于锚点的偏移量: 中心点就是位置。 按住shift 锚点和中心点都会被设置: 按住Alt: 同时按住shift和alt : 中心点 锚点 UI元素在对应的位置上。 锚点拉伸情况…...
![](https://img-blog.csdnimg.cn/d7c8cf3c3dca4b01a39bcc0d1d52801a.png)
Hadoop:HDFS--分布式文件存储系统
目录 HDFS的基础架构 VMware虚拟机部署HDFS集群 HDFS集群启停命令 HDFS Shell操作 hadoop 命令体系: 创建文件夹 -mkdir 查看目录内容 -ls 上传文件到hdfs -put 查看HDFS文件内容 -cat 下载HDFS文件 -get 复制HDFS文件 -cp 追加数据到HDFS文件中 -appendTo…...
![](https://img-blog.csdnimg.cn/03609ccbc954484395a4c7f35f1950d6.png)
自定义封装异步任务组件,实现FutureTask功能
FutureTask 在 JDK1.8 后的异步编排API中的CompletableFuture,提供了 异步任务的成功回调、异常回调。 public class FutureTaskTest {public static void main(String[] args) throws Exception {CompletableFuture<String> future CompletableFuture.sup…...
![](https://img-blog.csdnimg.cn/img_convert/0a89e74c9dc709ba6e79d73a3dfaad4c.webp?x-oss-process=image/format,png)
【区块链 | IPFS】IPFS节点搭建、文件上传、节点存储空间设置、节点上传文件chunk设置
一、创建ipfs节点 通过ipfs init在本地计算机建立一个IPFS节点 本文有些命令已经执行过了,就没有重新初始化。部分图片拷贝自先前文档,具体信息应以实物为准 ipfs init initializing IPFS node at /Users/CHY/.ipfs generating 2048-bit RSA keypair.…...
![](https://img-blog.csdnimg.cn/2d889d11324b4edeab1584654afb4969.png)
【autodesk】浏览器中渲染rvt模型
使用Forge完成渲染 Forge是什么 为什么能够渲染出来rvt模型 Forge是由Autodesk开发的一套云端开发平台和工具集。在Forge平台中,有一个名为"Model Derivative"的服务,它可以将包括RVT(Revit)在内的多种BIM(…...
![](https://img-blog.csdnimg.cn/7753166dbb4345698e96a92212bc612e.jpeg)
Python超入门(1)__迅速上手操作掌握Python
# 1.第一个代码:输出语句 # 1.第一个代码:输出语句 print("My dogs name is Huppy!") print(o----) print( ||| ) print("*" * 10) """ 输出结果: My dogs name is Huppy! o----||| ********** "&…...
![](https://www.ngui.cc/images/no-images.jpg)
后端面试话术集锦第 十四 篇:go语言面试话术
这是后端面试集锦第十四篇博文——go语言面试话术❗❗❗ 1. go数组、切片、扩容 go的数组和切片都是用来存储相同类型的数据集合。 数组是存储固定大小的集合,且为值引用。 但切片是存储无固定大小的集合,且为引用类型。 切片有三个属性,分别为指向指针的数组array,数组…...
![](https://www.ngui.cc/images/no-images.jpg)
Oralce集群管理-19C RAC 私有网络调整为BOND1
1 尝试在线添加私有网络的新接口 是否成功。 使用oifcfg命令在线添加新的网卡接口,在还没有配置bond1的条件下 也是可以添加成功的。 [gridorcldb1 ~]$ oifcfg getif eno3 192.168.224.0 global public ens3f0 10.2.0.0 global cluster_interconnect,asm eno…...
洛谷 Array 数论
题目: 对于长度为n的数组A,A中只包含从1到n的整数(可重复)。如果A单调不上升或单调不下降,A就可称为美丽的。 找出在长度为n时,有几个美丽的A。 思路: 这是一道数论题。 我们先找找“单调不递…...
![](https://img-blog.csdnimg.cn/10bec875de56446b84753ee69dda3b1c.png)
简明SQL条件查询指南:掌握WHERE实现数据筛选
条件查询是用于从数据库中根据特定条件筛选数据行的一种方式,它避免了检索整个表中的数据。通常,使用 WHERE 子句来定义过滤条件,只有符合这些条件的数据行才会被返回。 SQL中的运算符有:、!、<、> 等,用于进行…...
![](https://www.ngui.cc/images/no-images.jpg)
通过HbaseClient来写Phoenix表实现
由于数据存储在Hbase上,并且上层使用了Phoenix来读写数据。并且由于数据的列字段不固定,并且可能由于Hbase表列和Phoenix的表列字段不一致,使用Phoenix写入的数据会导致写出报错的问题出现。所以这里直接使用HbaseClient写入到Hbase表中&…...
![](https://www.ngui.cc/images/no-images.jpg)
uniapp qiun charts H5使用echarts的eopts配置不生效
原因是:使用web的要设置 echartsH5 :echartsH5"true" <template><view class"charts-box"><view class"chart-title"> 趋势</view><qiun-data-chartstype"column":eopts"eopts":cha…...
![](https://img-blog.csdnimg.cn/c0ad96e39b6c40d9b06931825edc4f99.png)
嵌入式Linux驱动开发(LCD屏幕专题)(三)
1. 硬件相关的操作 LCD驱动程序的核心就是: 分配fb_info设置fb_info注册fb_info硬件相关的设置 硬件相关的设置又可以分为3部分: 引脚设置时钟设置LCD控制器设置 2. 在设备树里指定LCD参数 framebuffer-mylcd {compatible "100ask,lcd_drv&qu…...
![](https://img-blog.csdnimg.cn/img_convert/29281dd864040aaffa62329dd032a904.png)
MySQL视图用户管理
文章目录 视图视图的规则用户用户信息创建用户删除用户修改密码 用户权限给用户授权回收权限 视图 视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。视图的数据变化会影响到基表,基表的数据变化也会…...
![](https://img-blog.csdnimg.cn/92550d30630849b2a13412a7cc8a6ea3.png)
我发现了一个很好看的字体,霞鹜文楷!如何换windows和typora字体?
1、字体 官方地址如下,下载也很简单。 https://github.com/lxgw/LxgwWenKai 有1W多的stars。 方式: 直接打包下载。下载不来,可以联系我。 然后ttf的文件,全部安装就行了。 reg save "HKCU\Control Panel" .\res…...
![](https://img-blog.csdnimg.cn/img_convert/21d39bc46c65f119904ffead5b9bbca8.jpeg)
微软8月系统更新引发问题:虚拟内存分页文件出现错误
微软的八月系统更新引发了一系列问题,其中包括“UNSUPPORTED_PROCESSOR”蓝屏错误和文件管理器故障。尽管微软已经修复了前者,但据国外科技媒体Windows Latest报道,仍有用户反馈在非微星设备上出现“fault in nonpaged area”蓝屏错误。 如果…...
![](https://img-blog.csdnimg.cn/img_convert/10f10b5727e3bd10fd7978634f610949.png)
swiper删除虚拟slide问题
在存在缓存的情况下,删除较前的slide,会出现当前slide与后一个slide重复出现的情况 假设当前存在5个slide,且这5个slide已缓存,则删除slide2后,仍为5个slide,且slide2的内容变为slide3的内容,此…...
![](https://img-blog.csdnimg.cn/d9452fbe2eed46979b8410d170f94aac.png)
FPGA实战小项目2
基于FPGA的贪吃蛇游戏 基于FPGA的贪吃蛇游戏 基于fpga的数字密码锁ego1 基于fpga的数字密码锁ego1 基于fpga的数字时钟 basys3 基于fpga的数字时钟 basys3...
![](https://www.ngui.cc/images/no-images.jpg)
一些关于完整小程序项目的优秀开源
转载自: 35个项目,开源,开源! (qq.com) 那几本霸占我休息时间的PDF! (qq.com) 13个超强的 SpringBoot 实战项目 (还不赶紧收藏起来) (qq.com) 用SpringBoot开发一个人脸识别系统!…...
![](https://img-blog.csdnimg.cn/7c8a0f06dc644b368fe72292a2aa4e19.png)
Windows模拟器推荐
物是人非事事休,欲语泪先流 Windows模拟器推荐 如果你需要在 Windows 操作系统之外运行 Windows 应用程序或测试不同版本的 Windows,有几个 Windows 模拟器和虚拟机软件可供选择。以下是一些常用的 Windows 模拟器和虚拟机软件: VirtualBox&…...
![](https://img-blog.csdnimg.cn/3a01dc60e62c415b812015851343f1c0.png#pic_center)
搭建RabbitMQ消息服务,整合SpringBoot实现收发消息
作者主页:Designer 小郑 作者简介:3年JAVA全栈开发经验,专注JAVA技术、系统定制、远程指导,致力于企业数字化转型,CSDN博客专家,蓝桥云课认证讲师。 目录 一、前言1.1 什么是消息队列1.2 RabbitMQ 是什么1.…...
![](https://img-blog.csdnimg.cn/9312a9ffb1164dc6bd7622d97934f702.png)
Web framework-Gin(二)
目录 一、Gin 1、Ajax 2、文件上传 2.1、form表单中文件上传(单个文件) 2.2、form表单中文件上传(多个文件) 2.3、ajax上传单个文件 2.4、ajax上传多个文件 3、模板语法 4、数据绑定 5、路由组 6、中间件 一、Gin 1、Ajax AJAX 即“Asynchronous Javascript And XM…...
![](https://img-blog.csdnimg.cn/3f3044efc49d4972ad276cfff3de2afd.png)
【聚类】K-Means聚类
cluster:簇 原理: 这边暂时没有时间具体介绍kmeans聚类的原理。简单来说,就是首先初始化k个簇心;然后计算所有点到簇心的欧式距离,对一个点来说,距离最短就属于那个簇;然后更新不同簇的簇心&a…...
![](https://img-blog.csdnimg.cn/img_convert/cf9973dd1206edeae99010f28dc50815.png)
超图聚类论文阅读2:Last-step算法
超图聚类论文阅读2:Last-step算法 《使用超图模块化的社区检测算法》 《Community Detection Algorithm Using Hypergraph Modularity》 COMPLEX NETWORKS 2021, SCI 3区 具体实现源码见HyperNetX库 工作:提出了一种用于超图的社区检测算法。该算法的主要…...
![](https://www.ngui.cc/images/no-images.jpg)
React 防抖与节流用法
在React中,防抖和节流是优化性能和提升用户体验的常用技术。下面是它们的用法: 防抖(Debounce):防抖是指在某个事件触发后,等待一段时间后执行回调函数。如果在等待时间内再次触发该事件,将重新…...
![](https://img-blog.csdnimg.cn/cdc256e784064e38ae8a1250cabf4db7.png#pic_center)
发布 VectorTraits v1.0,它是 C# 下增强SIMD向量运算的类库
发布 VectorTraits v1.0, 它是C#下增强SIMD向量运算的类库 VectorTraits: SIMD Vector type traits methods (SIMD向量类型的特征方法). NuGet: https://www.nuget.org/packages/VectorTraits/1.0.0 源代码: https://github.com/zyl910/VectorTraits 用途 总所周知&#x…...
![](https://img-blog.csdnimg.cn/5a11cf71b5d8460983868f653f2d15a2.png)
HCIA自学笔记01-冲突域
共享式网络(用同一根同轴电缆通信)中可能会出现信号冲突现象。 如图是一个10BASE5以太网,每个主机都是用同一根同轴电缆来与其它主机进行通信,因此,这里的同轴电缆又被称为共享介质,相应的网络被称为共享介…...
![](https://img-blog.csdnimg.cn/eec26648339c4459bc33a89ccae81a74.png)
3D封装技术发展
长期以来,芯片制程微缩技术一直驱动着摩尔定律的延续。从1987年的1um制程到2015年的14nm制程,芯片制程迭代速度一直遵循摩尔定律的规律,即芯片上可以容纳的晶体管数目在大约每经过18个月到24个月便会增加一倍。但2015年以后,芯片制…...
![](https://www.ngui.cc/images/no-images.jpg)
探讨下live555用的编程设计模式
这个应该放到这里 7.live555mediaserver-第1阶段小结(完整对象图和思维导图) https://blog.csdn.net/yhb1206/article/details/127330771 但是想想,还是拿出来吧。 从这第1阶段就能发现,它实质用到了reactor网络编程模式。...
wordpress boombox/搜索app下载
有些同学可能会和我有一样的困扰,每次想要更改字体大小、背景颜色等,都需要百度一下才知道怎么去做。。。不知道有没有这种情况的孩子,反正我经常遇到,老是记不住,今天写下来,顺带自己忘记的时候可以查看一…...
编程软件手机/关键词seo排名怎么选
除了是动手的程序员,我还是定制软件开发公司Teamed.io的联合创始人兼CTO。 在我们合作的所有项目中,我都扮演着技术和管理领导者的角色。 我为有兴趣雇用我和/或我的团队的人写了这篇文章。 本文将演示从第一天到项目结束时您选择与我们合作的过程 。 …...
![](/images/no-images.jpg)
asp绿色简洁通用型企业网站源码/百度seo搜索引擎优化培训
点击下载 FileDown.zip 主要功能如下 1.参数为虚拟路径 2.获取物理地址 3.普通下载 4.分块下载 5.输出硬盘文件,提供下载 支持大文件、续传、速度限制、资源占用小 看下面代码吧 /// <summary> /// 编 码 人:苏飞 /// 联系方式:3619836…...
![](/images/no-images.jpg)
有了域名 怎么做网站/抖音关键词优化排名
java中String是对象类型,不能使用""比较。正确的用法如下: if(A.equals(B)){//相等 }...
![](https://img2018.cnblogs.com/blog/1223374/201812/1223374-20181201220751432-390021265.png)
如何做公司网站简介/流量网站
相信大家在工作中会经常遇见对json进行序列化与反序列化吧,但通常的序列化与反序列化中的json结构与c#中的类模型结构是相对应的,我们是否可以在序列化一个对象时候,让我们json的数据结构能按照自己的意愿,而不必与该对象的数据结…...
![](/images/no-images.jpg)
wordpress怎么添加导航/免费行情软件网站下载大全
使用编辑 WinIO程序库允许在32位的Windows应用程序中直接对I/O端口和物理内存进行存取操作。通过使用一种内核模式的设备驱动器和其它几种底层编程技巧,它绕过了Windows系统的保护机制。3工作原理编辑 WinNT/2000/XP下,WinIO函数库只允许被具有管理者权限…...