当前位置: 首页 > news >正文

化学式字符串解析:一道考验递归功底的经典题

在这里插入图片描述

求解思路

采用递归 + TreeMap 的方案:

用递归处理从当前位置到右括号或字符串末尾的内容,遇到大写字母或左括号时,将之前的内容结算到总表中;而TreeMap能够自动保证字典序,便于最终输出。

完整代码实现

public class Solution {// 全局变量,记录递归处理到的位置public static int where;public static String countOfAtoms(String str) {where = 0;// 递归解析整个字符串TreeMap<String, Integer> map = f(str.toCharArray(), 0);// 构建输出结果StringBuilder ans = new StringBuilder();for (String key : map.keySet()) {ans.append(key);int cnt = map.get(key);if (cnt > 1) {  // 数量为1时不输出数字ans.append(cnt);}}return ans.toString();}public static TreeMap<String, Integer> f(char[] s, int i) {TreeMap<String, Integer> ans = new TreeMap<>();  // 当前层级的总表StringBuilder name = new StringBuilder();         // 当前正在收集的原子名称TreeMap<String, Integer> pre = null;              // 上一个括号的统计结果int cnt = 0;                                      // 当前收集的倍数while (i < s.length && s[i] != ')') {// 遇到大写字母或左括号:触发结算if (s[i] >= 'A' && s[i] <= 'Z' || s[i] == '(') {fill(ans, name, pre, cnt);  // 将之前的内容加入总表// 重置状态name.setLength(0);pre = null;cnt = 0;if (s[i] >= 'A' && s[i] <= 'Z') {// 收集新的原子名称(以大写字母开头)name.append(s[i++]);} else {// 遇到左括号:递归处理括号内容pre = f(s, i + 1);i = where + 1;  // 跳过递归处理过的部分}} // 小写字母:追加到原子名称else if (s[i] >= 'a' && s[i] <= 'z') {name.append(s[i++]);} // 数字:累加倍数else {cnt = cnt * 10 + s[i++] - '0';}}// 处理最后一部分内容fill(ans, name, pre, cnt);where = i;  // 更新全局位置,告知上层递归处理到哪里return ans;}public static void fill(TreeMap<String, Integer> ans, StringBuilder name, TreeMap<String, Integer> pre, int cnt) {if (name.length() > 0 || pre != null) {cnt = cnt == 0 ? 1 : cnt;  // 没有数字默认为1if (name.length() > 0) {// 处理单个原子:如 H2 中的 HString key = name.toString();ans.put(key, ans.getOrDefault(key, 0) + cnt);} else {// 处理括号结果:如 (OH)2 中的 OH 表for (String key : pre.keySet()) {ans.put(key, ans.getOrDefault(key, 0) + pre.get(key) * cnt);}}}}
}

如果觉得有帮助,欢迎点赞、关注、转发~

http://www.dtcms.com/a/619038.html

相关文章:

  • 免费推广网站平台成都定制网站建
  • 【Java 微服务中间件】RabbitMQ 全方位解析:同步异步对比、SpringAMQT基础入门、实战、交换机类型及消息处理详解
  • 做网站的收益lnmp wordpress 伪静态
  • 华为HuaweiCloudStack(一)介绍与架构
  • 招商网站建设定做如何给wordpress增加表单
  • 网站维护项目织梦网站安装播放视频插件下载
  • mysql锁机制入门笔记(备份)
  • Snakemake 从入门到实战:生信自动化工作流搭建指南
  • 深入理解CSS布局:从格子布局到响应式栅格系统
  • 做一个电商网站网站源代码下载软件
  • 网站怎么做网上报名河北网站建设方案
  • 珲春建设局网站备案用网站建设方案书
  • 南京小程序开发网站建设网页设计一页多少钱
  • 做投标的网站南平建设集集团网站
  • 以投资思维做网站h5响应式网站开发
  • 做旅游攻略去什么网站密云网站建设公司
  • Linux 中的 CPU。文章 1. 利用率
  • 自然语言处理实战——基于混合专家模型(MoE)的文本生成
  • ps做网站浏览器预览网站备案号显示红色
  • 暗黑模式【闪白】解决方案
  • Spring Boot + Vue 实现一个在线商城(商品展示、购物车、订单)!从零到一完整项目
  • h5可以制作公司网站吗网站用什么框架做
  • AlmaLinux9.6 部署 MariaDB10.11 和 Zabbix7.0 完整教程
  • 东莞市手机网站建设怎么样自己如何做微信小程序
  • 怎么提升网站收录编程培训班学费一般多少钱
  • Git 在团队中的最佳实践--如何正确使用Git Flow
  • 燕郊做网站的安卓程序开发用什么软件
  • 汽车网站建设需要多少钱做网站后期费用
  • Leetcode 3748. Count Stable Subarrays
  • LeetCode Hot100 缺失的第一个正数