【华为OD题库-034】字符串化繁为简-java

题目

给定一个输入字符串,字符串只可能由英文字母(a ~ z、A ~ Z)和左右小括号()组成。当字符里存在小括号时,小括号是成对的,可以有一个或多个小括号对,小括号对不会嵌套,小括号对内可以包含1个或多个英文字母也可以不包含英文字母。当小括号对内包含多个英文字母时,这些字母之间是相互等效的关系,而且等效关系可以在不同的小括号对之间传递,即当存在a和b等效和存在b和c等效时,a和c 也等效,另外,同一个英文字母的大写字和小写字母也相互等效(即使它们分布在不同的括号对里)。
要对这个输入字符串做简化,输出一个新的字符串,输出字符串里只需保留输入字符串里的没有被小括号对包含的字符(按照输入字符串里的字符顺序),并将每个字符替换为在小括号对里包含的字典序最小的等效字符。如果简化后的字符串为空,请输出为"0"
示例:输入字符串为"never(dont)live(run)up(f)()“,初始等效字符集合为(d,o,n,t,r,u,n),由于等效关系可以传递,因此最终等效字符集合为(d,n,o,r,t,u),将输入字符串里的剩余部分按字典序最小的等效字符替换后得到"devedlivedp”
输入描述
input string
输入为1行,代表输入字符串
输出描述
output string
输出为1行,代表输出字符串
备注
输入字符串的长度在1~100000之间
示例1:
输入∶
()abd
输出:
abd
说明:
输入字符串里没有被小括号包含的字符串为"abd",其中每个字符没有等效字符,输出为"abd"
示例2:
输入∶
(abd)demand(fb)()for
输出:
aemanaaor
说明:
等效字符集为(a,b,d, f),输入字符串里没有被小括号包含的字符串集合为demandfor”,将其中字符替换为字典序最小的等效字符后输出为:“aemanaaor”
示例3:
输入∶
happy(xyz)new(wxy)year(t)
输出:
happwnewwear
说明:
等效字符集为(w,x,y,z),输入字符串里没有被小括号包含的字符串集合为"happynewyear”,将其中字符替换为字典序最小的等效字等后输出为:“happwnewwear”

思路

比如输入的字符串为:NeVeD(dont)Live(Drun)up(f)()
按照题意:
先提取小括号(括号内字符数大于1)里的字符:dontDrun,去重后为,dDontru。由于大小写是等效的,所以这里如果转为全小写并去重排序后的结果为:dnortu。于是现在需要将原来字符串中的d,n,o,r,t,u,全部转为d。得到字符串:deVedLivedp
但是当我们全转为大写时,将原来字符串中的d,n,o,r,t,u,全部转为D,得到结果:DeVeDLiveDp
题目应该是对输出字符串是忽略大小写的,否则按照不同方式处理会得到不同的结果。
解题思路如下:

  1. 首先提取小括号内的字符放入set中去重,小括号内字符个数大于1时才放入set
  2. 将其他字符(非小括号内的字符)组成新字符串:newStr
  3. 对set中的字符按照字典序排序,并转为字符数组:chars
  4. 对newStr中遍历,当某个字符出现在chars中时,将它替换为chars[0]
  5. 最后输出newStr即可

关键在于第1、2步,即将输入字符串分离为括号内字符和括号外字符两部分
我们可以使用栈stack来实现,使用sb(StringBuilder)存放括号外的字符,使用set存放括号内的字符,将输入字符串转为chars数组,遍历chars:

  1. 如果stack为空时,说明没有出现括号,直接把字符加入sb
  2. 如果stack不为空或者字符串为(时,说明已经出现了括号,或者第一次出现括号,直接把字符加入stack
  3. 如果遇到 ),代表一对括号结束,应该清除stack。并且还需要根据括号对中的字符数量判断是否加入set中。怎么判断数量?此时stack中的字符为:(、若干字符(stack.size-1),如果字符数量大于1,那么应该将stack中除最后一个(外的字符加入set。

最后考虑特殊情况,比如按照括号对分离后sb为空,直接输出0,set为空,则直接输出sb.toString()

题解

package hwod;import java.util.*;public class StringSimplifying {public static void main(String[] args) {Scanner sc = new Scanner(System.in);String str = sc.nextLine();System.out.println(stringSimplifying(str));}private static String stringSimplifying(String str) {Set<Character> set = new HashSet<>();//存储括号内的字符StringBuilder sb = new StringBuilder();//存储括号外的字符LinkedList<Character> queue = new LinkedList<>();for (int i = 0; i < str.length(); i++) {if (str.charAt(i) == ')') {if (queue.size() - 1 > 1) {while (queue.size() > 1) {set.add(Character.toLowerCase(queue.pollLast()));//大小写等效,全转为小写}}queue.clear();continue;}if (str.charAt(i) == '(' || !queue.isEmpty()) {queue.addLast(str.charAt(i));continue;}sb.append(str.charAt(i));}if (sb.length() == 0) {return "0";}if (set.size() == 0) {return sb.toString();}ArrayList<Character> chars = new ArrayList<>(set);Collections.sort(chars);final char[] newChars = sb.toString().toCharArray();for (int i = 0; i < newChars.length; i++) {if (chars.contains(Character.toLowerCase(newChars[i]))) {newChars[i] = chars.get(0);}}return String.valueOf(newChars);}
}

推荐

如果你对本系列的其他题目感兴趣,可以参考华为OD机试真题及题解(JAVA),查看当前专栏更新的所有题目。

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

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

相关文章

Jenkins Ansible 参数构建

首先在Jenkins中创建自由项目 在web端配置完成后在另一台机子上下载nginx 在gitlab端创建项目并创建文件配置代码 在有Jenkins的机器上下载Ansible [rootslave1 ~]# yum -y install epel-release [rootslave1 ~]# yum -y install ansible再进入下载nginx机器中克隆gitlab项目…

Android 框架层AIDL 添加接口

文章目录 AIDL的原理构建AIDL的流程往冻结的AIDL中加接口 AIDL的原理 可以利用ALDL定义客户端与服务均认可的编程接口&#xff0c;以便二者使用进程间通信 (IPC) 进行相互通信。在 Android 中&#xff0c;一个进程通常无法访问另一个进程的内存。因此&#xff0c;为进行通信&a…

卷积神经网络(AlexNet)鸟类识别

文章目录 一、前言二、前期工作1. 设置GPU&#xff08;如果使用的是CPU可以忽略这步&#xff09;2. 导入数据3. 查看数据 二、数据预处理1. 加载数据2. 可视化数据3. 再次检查数据4. 配置数据集 三、AlexNet (8层&#xff09;介绍四、构建AlexNet (8层&#xff09;网络模型五、…

微信小程序image组件图片设置最大宽度 宽高自适应

问题描述&#xff1a;在使用微信小程序image组件的时候&#xff0c;在不确定图片宽高情况下 想给一个最大宽度让图片自适应&#xff0c;按比例&#xff0c;image的widthfiex和heightFiex并不能满足&#xff08;只指定最大宽/高并不会生效&#xff09; 问题解决&#xff1a;使用…

居家适老化设计第二十九条---卫生间之花洒

无电源 灯光显示 无障碍扶手型花洒 以上产品图片均来源于淘宝 侵权联系删除 居家适老化卫生间的花洒通常具有以下特点和功能&#xff1a;1. 高度可调节&#xff1a;适老化卫生间花洒可通过调节高度&#xff0c;满足不同身高的老年人使用需求&#xff0c;避免弯腰或过高伸展造…

【开源】基于Vue.js的固始鹅块销售系统

项目编号&#xff1a; S 060 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S060&#xff0c;文末获取源码。} 项目编号&#xff1a;S060&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 鹅块类型模块2.3 固…

qgis添加xyz栅格瓦片

方式1&#xff1a;手动一个个添加 左侧浏览器-XYZ Tiles-右键-新建连接 例如添加高德瓦片地址 https://wprd01.is.autonavi.com/appmaptile?langzh_cn&size1&style7&x{x}&y{y}&z{z} 双击即可呈现 收集到的一些图源&#xff0c;仅供参考&#xff0c;其中一…

【C++学习手札】模拟实现list

​ &#x1f3ac;慕斯主页&#xff1a;修仙—别有洞天 ♈️今日夜电波&#xff1a;リナリア—まるりとりゅうが 0:36━━━━━━️&#x1f49f;──────── 3:51 &#x1f504; ◀️ ⏸ ▶️…

聊聊httpclient的staleConnectionCheckEnabled

序 本文主要研究一下httpclient的staleConnectionCheckEnabled staleConnectionCheckEnabled org/apache/http/client/config/RequestConfig.java public class RequestConfig implements Cloneable {public static final RequestConfig DEFAULT new Builder().build();pr…

【ARM 嵌入式 编译 Makefile 系列 18 -- Makefile 中的 export 命令详细介绍】

文章目录 Makefile 中的 export 命令详细介绍Makefile 使用 export导出与未导出变量的区别示例&#xff1a;导出变量以供子 Makefile 使用 Makefile 中的 export 命令详细介绍 在 Makefile 中&#xff0c;export 命令用于将变量从 Makefile 导出到由 Makefile 启动的子进程的环…

qgis添加wms服务

例如添加geoserver的wms服务 左右浏览器-WMS/WMTS-右键-新建连接 URL添加geoserver的wms地址 http://{ip}:{port}/geoserver/{workspace}/wms 展开wms目录&#xff0c;双击相应图层即可打开

Spark---基于Yarn模式提交任务

Yarn模式两种提交任务方式 一、yarn-client提交任务方式 1、提交命令 ./spark-submit --master yarn --class org.apache.spark.examples.SparkPi ../examples/jars/spark-examples_2.11-2.3.1.jar 100 或者 ./spark-submit --master yarn–client --class org.apache.s…

三菱PLC应用[集锦]

三菱PLC应用[集锦] 如何判断用PNP还是NPN的个人工作心得 10&#xff5e;30VDC接近开关与PLC连接时&#xff0c;如何判断用PNP还是NPN的个人工作心得: 对于PLC的开关量输入回路。我个人感觉日本三菱的要好得多&#xff0c;甚至比西门子等赫赫大名的PLC都要实用和可靠&#xff01…

vulnhub4

靶机地址: https://download.vulnhub.com/admx/AdmX_new.7z 信息收集 fscan 扫一下 ┌──(kali㉿kali)-[~/Desktop/Tools/fscan] └─$ ./fscan_amd64 -h 192.168.120.138 ___ _ / _ \ ___ ___ _ __ __ _ ___| | __ / /_\/____/ __|/ …

LeetCode | 622. 设计循环队列

LeetCode | 622. 设计循环队列 OJ链接 思路&#xff1a; 我们这里有一个思路&#xff1a; 插入数据&#xff0c;bank往后走 删除数据&#xff0c;front往前走 再插入数据&#xff0c;就循环了 那上面这个方法可行吗&#xff1f; 怎么判断满&#xff0c;怎么判断空&#xff1…

模电知识点总结(二)二极管

系列文章目录 文章目录 系列文章目录二极管二极管电路分析方法理想模型恒压降模型折线模型小信号模型高频/开关 二极管应用整流限幅/钳位开关齐纳二极管变容二极管肖特基二极管光电器件光电二极管发光二极管激光二极管太阳能电池 二极管 硅二极管&#xff1a;死区电压&#xf…

今年注册电气工程师考试乱象及就业前景分析

1、注册电气工程师挂靠价格 # 2011年以前约为5万一年&#xff0c;2011年开始强制实施注册电气执业制度&#xff0c;证书挂靠价格开始了飞涨&#xff0c;2013年达到巅峰&#xff0c;供配电15万一年&#xff0c;发输变电20-25万一年&#xff0c;这哪里是证书&#xff0c;简直就是…

Docker kill 命令

docker kill&#xff1a;杀死一个或多个正在运行的容器。 语法&#xff1a; docker kill [OPTIONS] CONTAINER [CONTAINER...]OPTIONS说明&#xff1a; -s&#xff1a;向容器发送一个信号 描述&#xff1a; docker kill子命令会杀死一个或多个容器。容器内的主进程被发送S…

C语言数组的距离(ZZULIOJ1200:数组的距离)

题目描述 已知元素从小到大排列的两个数组x[]和y[]&#xff0c; 请写出一个程序算出两个数组彼此之间差的绝对值中最小的一个&#xff0c;这叫做数组的距离 。 输入&#xff1a;第一行为两个整数m, n(1≤m, n≤1000)&#xff0c;分别代表数组f[], g[]的长度。第二行有m个元素&a…

如何在Simulink中使用syms?换个思路解决报错:Function ‘syms‘ not supported for code generation.

问题描述 在Simulink中的User defined function使用syms函数&#xff0c;报错simulink无法使用外部函数。 具体来说&#xff1a; 我想在Predefined function定义如下符号函数作为输入信号&#xff0c;在后续模块传入函数参数赋值&#xff0c;以实现一次定义多次使用&#xf…