Lc43---- 1221. 分割平衡字符串(java版)---(贪心)(字符串)

1.题目描述

在这里插入图片描述

2.知识点和思路

(1)贪心算法的基本思想
选择性质:在每一步中,选择当前最优的选项,不考虑未来的后果。
局部最优解:通过一系列局部最优选择,构建全局最优解。
不可回溯:一旦做出选择,不能回溯来改变之前的选择。
(2)贪心算法的例子
例子 1:找零问题
问题:给定一个金额,求用最少数量的硬币凑出该金额。假设硬币的面值有 1 元、5 元、10 元和 25 元。
贪心算法的思想:每次选择面值最大的硬币。
算法步骤:
选择当前金额下可用的最大面值的硬币。
从总金额中减去该硬币的面值。
重复上述步骤,直到总金额为 0。

import java.util.ArrayList;
import java.util.List;public class CoinChange {public static List<Integer> coinChange(int amount) {int[] coins = {25, 10, 5, 1};List<Integer> result = new ArrayList<>();for (int coin : coins) {while (amount >= coin) {amount -= coin;result.add(coin);}}return result;}public static void main(String[] args) {int amount = 41;List<Integer> result = coinChange(amount);System.out.println(result); // 预期输出: [25, 10, 5, 1]}
}

(3)贪心算法的例子2(太抽象了,暂时理解不了)
例子 2:活动选择问题
问题:给定一组活动,每个活动有开始时间和结束时间,要求选择尽可能多的互不重叠的活动。
贪心算法的思想:每次选择结束时间最早的活动,这样可以确保剩下的时间最大化。
算法步骤:
按活动结束时间排序。
选择第一个活动。
对于每个后续活动,如果其开始时间大于等于上一个选择活动的结束时间,则选择该活动。

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;public class ActivitySelection {public static List<int[]> activitySelection(int[][] activities) {// 按活动结束时间排序Arrays.sort(activities, (a, b) -> a[1] - b[1]);List<int[]> result = new ArrayList<>();int[] lastActivity = activities[0];result.add(lastActivity);for (int i = 1; i < activities.length; i++) {if (activities[i][0] >= lastActivity[1]) {lastActivity = activities[i];result.add(lastActivity);}}return result;}public static void main(String[] args) {int[][] activities = {{1, 4},{3, 5},{0, 6},{5, 7},{3, 8},{5, 9},{6, 10},{8, 11},{8, 12},{2, 13},{12, 14}};List<int[]> result = activitySelection(activities);for (int[] activity : result) {System.out.println(Arrays.toString(activity));}// 预期输出: [[1, 4], [5, 7], [8, 11], [12, 14]]}
}

(4)返回可以通过分割得到的平衡字符串的 最大数量 。
我的思路是要返回平衡字符串的最大数量,说明分割的子字符串要足够的小,且保证字符串的两种字符的数量是想等的。

(5)字符串分割是处理和解析字符串的常见操作。
例子1:使用 split 方法
split 方法使用正则表达式将字符串分割成子字符串数组。

public class SplitExample {public static void main(String[] args) {String str = "apple,banana,cherry";String[] fruits = str.split(",");for (String fruit : fruits) {System.out.println(fruit);}// 预期输出:// apple// banana// cherry}
}

例子2:知道分割的位置,可以使用 substring 方法手动分割字符串。

public class SubstringExample {public static void main(String[] args) {String str = "apple-banana-cherry";int firstDash = str.indexOf("-");int secondDash = str.indexOf("-", firstDash + 1);String firstPart = str.substring(0, firstDash);String secondPart = str.substring(firstDash + 1, secondDash);String thirdPart = str.substring(secondDash + 1);System.out.println(firstPart);System.out.println(secondPart);System.out.println(thirdPart);// 预期输出:// apple// banana// cherry}
}

补充1:substring 方法在 Java 中用于从字符串中提取子字符串。它有两种主要的使用方式:
1)substring(int beginIndex):返回从指定的起始索引(包含)开始到字符串末尾的子字符串。

public class SubstringExample1 {public static void main(String[] args) {String str = "apple-banana-cherry";// 从索引 6 开始到字符串末尾的子字符串String subStr1 = str.substring(6);System.out.println(subStr1); // 预期输出: banana-cherry}
}

2)substring(int beginIndex, int endIndex):返回从指定的起始索引(包含)到结束索引(不包含)之间的子字符串。

public class SubstringExample2 {public static void main(String[] args) {String str = "apple-banana-cherry";// 从索引 6 开始到索引 12 (不包含) 的子字符串String subStr2 = str.substring(6, 12);System.out.println(subStr2); // 预期输出: banana}
}

补充2:str.indexOf(“-”) 方法在 Java 中用于查找字符串中第一次出现指定子字符串或字符的位置。它返回子字符串或字符在字符串中的索引(位置),如果找不到则返回 -1。

public class IndexOfExample {public static void main(String[] args) {String str = "apple-banana-cherry";// 找到第一个 '-' 的位置int firstDash = str.indexOf("-");System.out.println("The first '-' is at index: " + firstDash); // 预期输出: 5// 找到第二个 '-' 的位置,从第一个 '-' 之后开始搜索int secondDash = str.indexOf("-", firstDash + 1);System.out.println("The second '-' is at index: " + secondDash); // 预期输出: 12}
}

补充3:结合 indexOf 和 substring 使用

public class CombinedExample {public static void main(String[] args) {String str = "apple-banana-cherry";// 找到第一个 '-' 的位置int firstDash = str.indexOf("-");// 找到第二个 '-' 的位置,从第一个 '-' 之后开始搜索int secondDash = str.indexOf("-", firstDash + 1);// 提取第一个 '-' 之前的子字符串String firstPart = str.substring(0, firstDash);System.out.println("First part: " + firstPart); // 预期输出: apple// 提取第一个 '-' 和第二个 '-' 之间的子字符串String secondPart = str.substring(firstDash + 1, secondDash);System.out.println("Second part: " + secondPart); // 预期输出: banana// 提取第二个 '-' 之后的子字符串String thirdPart = str.substring(secondDash + 1);System.out.println("Third part: " + thirdPart); // 预期输出: cherry}
}

补充4:实现括号平衡检查

import java.util.Stack;public class BalancedParentheses {public static boolean isBalanced(String s) {Stack<Character> stack = new Stack<>();for (char c : s.toCharArray()) {if (c == '(' || c == '{' || c == '[') {stack.push(c);} else if (c == ')' || c == '}' || c == ']') {if (stack.isEmpty()) {return false;}char top = stack.pop();if (!isMatchingPair(top, c)) {return false;}}}return stack.isEmpty();}private static boolean isMatchingPair(char left, char right) {return (left == '(' && right == ')') ||(left == '{' && right == '}') ||(left == '[' && right == ']');}public static void main(String[] args) {String test1 = "{[()]}";String test2 = "{[(])}";String test3 = "{{[[(())]]}}";System.out.println(isBalanced(test1)); // 预期输出: trueSystem.out.println(isBalanced(test2)); // 预期输出: falseSystem.out.println(isBalanced(test3)); // 预期输出: true}
}

3.代码实现

先弄L,R计数器,还有一个平衡计数器。
在for循环里面(首先要满足将字符串变成字符数组,也就是s.toCharArrat())
对L、R字符进行计数,当cntL==cntR的时候,平衡字符串计数+1,cntL和cntR重新置0.

class Solution {public int balancedStringSplit(String s) {int cntL=0;int cntR=0;int BalanceCnt=0;for(char c:s.toCharArray()){if(c=='R'){cntR++;}else if(c=='L'){cntL++;}if(cntR==cntL){BalanceCnt++;cntR=0;cntL=0;}}return BalanceCnt;}
}

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

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

相关文章

2024电工杯A题详细思路代码分析数学建模:园区微电网风光储协调优化配置

题目分析&#xff1a;园区微电网风光储协调优化配置 我们会先给出三个问题总体的分析&#xff0c;最后会详细分析问题一的建模和详细内容。 背景&#xff1a; 园区微电网由风光发电和主电网联合为负荷供电&#xff0c;为了尽量提高风光电量的负荷占比&#xff0c;需配置较高比…

02--大数据Hadoop集群实战

前言&#xff1a; 前面整理了hadoop概念内容&#xff0c;写了一些概念和本地部署和伪分布式两种&#xff0c;比较偏向概念或实验&#xff0c;今天来整理一下在项目中实际使用的一些知识点。 1、基础概念 1.1、完全分布式 Hadoop是一个开源的分布式存储和计算框架&#xff0…

C++对C的扩充

C既可用于面向过程的程序设计&#xff0c;也可用于面向对象的程序设计。在面向过程程序设计的领域&#xff0c;C继承了C语言提供的绝大部分功能和语法规定&#xff0c;并在此基础上做了不少扩充&#xff0c;主要有一下几个方面&#xff1a; 1.C的输入输出 C为了方便用户&…

Spring 事务源码分析

前言&#xff1a; 我们知道 Spring 声明式事务是通过 AOP 来实现的&#xff0c;日常项目开发中我们只需要使用 Transactional 注解就可以实现声明式事务&#xff0c;那你知道通过 Transactional 注解怎样实现事务的吗&#xff1f;本篇我们将从源码来分析 Spring 声明式事务的执…

STM32定时器四大功能之定时器编码接口

1什么是编码器接口&#xff1f; 编码器接口接受编码器的正交信号&#xff0c;根据编码器产生的正交信号脉冲控制CNT的自增和自减&#xff0c;从而指示编码器的旋转方向和旋转速度。 每个高级定时器和通用定时器都有一个编码器接口&#xff0c;同时正交编码器产生的正交信号分…

Redis 的持久化(真的好细)

前言 Redis 是一个内存数据库&#xff0c;把数据存储在内存中&#xff0c;而内存中的数据是不持久的&#xff0c;要想数据持久就得将数据存储到硬盘中&#xff0c;而 Redis 相比于 Mysql 这样的关系型数据库最大的优势就在于将数据存储在内存中从而效率更高&#xff0c;速度更快…

docker 安装RabbitMQ-web版本

直接拉去web版本 docker pull rabbitmq:management启动命令 设置用户名 admin 密码123456 docker run -dit --name rabbitmq -p 5672:5672 -p 15672:15672 -e RABBITMQ_DEFAULT_USERadmin -e RABBITMQ_DEFAULT_PASS123456 rabbitmq:management访问地址 http://127.0.0.1:…

GeoScene产品学习视频收集

1、易智瑞运营的极思课堂https://www.geosceneonline.cn/learn/library 2、历年易智瑞技术公开课视频资料 链接&#xff1a;技术公开课-易智瑞信息技术有限公司&#xff0c;GIS/地理信息系统&#xff0c;空间分析-制图-位置智能-地图 3、一些关于GeoScene系列产品和技术操作的视…

二进制部署k8s集群 部署高可用master节点

目录 本次部署的环境 一、master02 节点部署 二、负载均衡部署 安装nginx服务 部署keepalive服务 修改node节点上的配置文件 在master节点上创建pod 三、部署 Dashboard 二进制部署k8s集群部署的步骤总结 &#xff08;1&#xff09;k8s的数据存储中中心的搭建 etcd &…

Apache Log4j Server 反序列化命令执行漏洞(CVE-2017-5645)

漏洞复现环境搭建请参考 http://t.csdnimg.cn/MxmId 漏洞版本 Apache Log4j 2.8.2之前的2.x版本 漏洞验证 &#xff08;1&#xff09;开放端口4712 漏洞利用 &#xff08;1&#xff09;ysoserial工具获取 wget https://github.com/frohoff/ysoserial/releases/download/v0…

Flink DataStream API 基础算子(一)

一、介绍 官网 DataStream API 得名于特殊的 DataStream 类&#xff0c;该类用于表示 Flink 程序中的数据集合。你可以认为 它们是可以包含重复项的不可变数据集合。这些数据可以是有界&#xff08;有限&#xff09;的&#xff0c;也可以是无界&#xff08;无限&#xff09;的…

spring启动后自动退出了

在项目中启动spring框架的application&#xff0c;但是还未等到接口访问它就自己退出了&#xff0c;运行截图如下所示&#xff1a; 解决办法&#xff1a; 将build.gradle文件里的依赖修改一下。我原先的依赖是&#xff1a; org.springframework:spring-web:5.3.10 现修改为 …

2024 电工杯高校数学建模竞赛(B题)| 平衡膳食食谱 |建模秘籍文章代码思路大全

铛铛&#xff01;小秘籍来咯&#xff01; 小秘籍团队独辟蹊径&#xff0c;运用负载均衡&#xff0c;多目标规划等强大工具&#xff0c;构建了这一题的详细解答哦&#xff01; 为大家量身打造创新解决方案。小秘籍团队&#xff0c;始终引领着建模问题求解的风潮。 抓紧小秘籍&am…

肯尼亚大坝决堤反思:强化大坝安全监测的必要性

一、背景介绍 近日&#xff0c;肯尼亚发生了一起严重的大坝决堤事件。当地时间4月29日&#xff0c;肯尼亚内罗毕以北的一座大坝决堤&#xff0c;冲毁房屋和车辆。当地官员称&#xff0c;事故遇难人数已升至71人。这起事件再次提醒我们&#xff0c;大坝安全无小事&#xff0c;监…

正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-23.1,2 讲 I2C驱动

前言&#xff1a; 本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM&#xff08;MX6U&#xff09;裸机篇”视频的学习笔记&#xff0c;在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。…

了解区块链基础设施,共同构建安全且强大的Sui网络

区块链基础设施的范畴很广&#xff0c;但其核心是那些直接与网络互动的计算机。这些实体通常被称为节点&#xff0c;分为不同的类型&#xff0c;例如维护完整区块链副本的全节点&#xff0c;以及作为共识决定者的验证节点。除了这两种类型之外&#xff0c;还有其他类型的节点&a…

【oracle的安装记录】

oracle安装记录 一、下载以后&#xff0c;解压到同一路径下面 二、双击可执行安装文件&#xff0c;等待文件加载 三、双击以后&#xff0c;弹出信息 四、提示该窗口&#xff0c;点击【是】即可 五、未填写配置安全更新信息 六、弹出小窗口&#xff0c;选择【是】 七、安装选项…

SQLI-labs-第二十四关

目录 1、登录界面 2、注册界面 3、修改密码界面 知识点&#xff1a;二次注入 思路&#xff1a; 这一关有几个页面可以给我们输入&#xff0c;一个登录界面&#xff0c;一个注册页面&#xff0c;一个修改密码界面 1、登录界面 首先我们登录界面看看 登录后出现一个修改密码…

Ubuntu 搭建SRT协议 环境

1.官网clone源码 GitHub - Haivision/srt: Secure, Reliable, Transport 打不开的话国内gitee 不是最新的 https://gitee.com/smartavs/srt.git 下下来之后 cd 到srt目录 需要安装cmake openssl等依赖 我的环境已经有了 mkdir build && cd build cmake .. -…

最有效的企业数据防泄漏手段 | 数据泄漏防护系统推荐

随意信息安全意识不断提高&#xff0c;企业纷纷寻求高效的数据防泄漏手段。在众多解决方案中&#xff0c;这五款软件各具特色&#xff0c;但它们的共同目标都是确保企业数据的安全性和保密性。 接下来&#xff0c;我们将逐一介绍这五款软件的特点和优势。 1、Ping 32 Ping32…