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

news2024/12/28 5:38:17

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)); // 预期输出: true
        System.out.println(isBalanced(test2)); // 预期输出: false
        System.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.coloradmin.cn/o/1687223.html

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

相关文章

Map六种遍历方式

下面是三组&#xff08;6种&#xff09;&#xff0c;Map 遍历方式的核心代码。 遍历方式有使用到增强for和迭代器。最下面有张图片&#xff0c;对做题有参考意义。 参考代码&#xff1a; Map map new HashMap();map.put("小猫","cat");map.put("小…

TypeScript-函数类型

函数类型 指给函数添加类型注解&#xff0c;本质上就是给函数的参数和返回值添加类型约束 function add(a: number,b: number) :number {return a b } let res: number res add(2 3) // 函数参数注解类型之后&#xff0c;不但限制了参数的类型还限制了参数为必填 优点&…

机器学习补充学习

1、Adaboost算法 Adaboost算法是一种集成学习方法&#xff0c;通过结合多个弱学习器来构建一个强大的预测模型。核心思想&#xff1a;如果一个简单的分类器在训练数据上犯错误&#xff0c;那么它在测试数据上也可能犯错误。 Adaboost通过迭代地训练一系列的分类器&#xff0c…

C语言 | Leetcode C语言题解之第101题对称二叉树

题目&#xff1a; 题解&#xff1a; /*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*/ bool isSymmetric(struct TreeNode* root) {if (root NULL) return true;//如果根为空直接…

基于YoloV4汽车多目标跟踪计数

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景与意义 随着城市交通的快速发展&#xff0c;交通流量和车辆密度的不断增加&#xff0c;对交通管理和控…

基于FPGA的VGA协议实现----条纹-文字-图片

基于FPGA的VGA协议实现----条纹-文字-图片 引言&#xff1a; ​ 随着数字电子技术的飞速发展&#xff0c;现场可编程门阵列&#xff08;FPGA&#xff09;因其高度的灵活性和并行处理能力&#xff0c;在数字系统设计中扮演着越来越重要的角色。FPGA能够实现复杂的数字逻辑&#…

Qt官方示例---embedded

digiflip flickable flightinfo lightmaps raycasting styleexample

pycharm 关闭项目卡死

PyCharm2023.3.4 关闭一直卡在 closing projects 解决办法&#xff1a; 打开PyCharm&#xff0c; 选择 Help -> Find Action -> 输入 Registry -> 禁用ide.await.scope.completion

leetCode-hot100-数组专题之双指针

数组双指针专题 1.同向双指针1.1例题26.删除有序数组中的重复项27.移除元素80.删除有序数组中的重复项 Ⅱ 2.相向双指针2.1例题11.盛最多水的容器42.接雨水581.最短无序连续子数组 双指针在算法题中很常见&#xff0c;下面总结双指针在数组中的一些应用&#xff0c;主要分为两类…

解决“Failed to restart udev.service“

报错信息 Failed to restart udev.service: Unit systemd-udevd.service is not loaded properly: Exec format error. See system logs and ‘systemctl status udev.service’ for details. invoke-rc.d: initscript udev, action “restart” failed. ● systemd-udevd.ser…

Day25:Leetcode:669. 修剪二叉搜索树 + 108.将有序数组转换为二叉搜索树 + 538.把二叉搜索树转换为累加树

LeetCode&#xff1a;669. 修剪二叉搜索树 问题描述 解决方案&#xff1a; 1.思路 2.代码实现 class Solution {public TreeNode trimBST(TreeNode root, int low, int high) {if (root null) {return null;}if (root.val < low) {return trimBST(root.right, low, hi…

跳房子游戏-第13届蓝桥杯选拔赛Python真题精选

[导读]&#xff1a;超平老师的Scratch蓝桥杯真题解读系列在推出之后&#xff0c;受到了广大老师和家长的好评&#xff0c;非常感谢各位的认可和厚爱。作为回馈&#xff0c;超平老师计划推出《Python蓝桥杯真题解析100讲》&#xff0c;这是解读系列的第71讲。 跳房子游戏&#…

一.ffmpeg 将内存中的H264跟PCM 数据流合成多媒体文件

在有一些嵌入式平台中&#xff0c;H264数据流一般来自芯片内部的硬编码器&#xff0c; AAC音频数据则是通过采集PCM进行软编码&#xff0c;但是如何对它实时进行封装多媒体文件 &#xff0c;参考ffmpeg example&#xff0c;花了一些时间终于实现了该功能。 流程图如下&#xf…

什么是经典蓝牙模块?

什么是经典蓝牙模块&#xff1f;   前面我们已经就蓝牙模块的概念做了了解&#xff0c;随着时间的推移&#xff0c;产品越来越智能&#xff0c;需要的蓝牙模块也就越来越广泛&#xff0c;本篇文章我们就一起了解下什么是经典蓝牙模块。   经典蓝牙模块(BT)泛指支持蓝牙协议…

ClickHouse配置与使用

静态IP配置 # 修改网卡配置文件 vim /etc/sysconfig/network-scripts/ifcfg-ens33# 修改文件内容 TYPEEthernet PROXY_METHODnone BROWSER_ONLYno BOOTPROTOstatic IPADDR192.168.18.128 NETMASK255.255.255.0 GATEWAY192.168.18.2 DEFROUTEyes IPV4_FAILURE_FATALno IPV6INIT…

AI办公自动化-kimi批量在多个Excel工作表中绘制柱状图

工作任务和目标&#xff1a;批量在多个Excel工作表中生成一个柱状图 第一步&#xff0c;在kimi中输入如下提示词&#xff1a; 你是一个Python编程专家&#xff0c;完成下面任务的Python脚本&#xff1a; 打开文件夹&#xff1a;F:\aivideo 读取里面所有的xlsx文件&#xff1…

【云原生之】K8s 管理工具 kubectl 详解(二)

一、项目的生命周期 创建–>发布–>更新–>回滚–>删除 1.1、创建kubectl create命令 创建并运行一个或多个容器镜像。创建一个deployment 或job 来管理容器。 kubectl create --help kubectl -n 命名空间 create deployment 资源名称 --image镜像 --port容器的端…

useTransition:开启React并发模式

写在前面&#xff1a;并发 并发模式&#xff08;Concurrent Mode&#xff09;1的一个关键特性是渲染可中断。 React 18 之前&#xff0c;更新内容渲染的方式是通过一个单一的且不可中断的同步事务进行处理。同步渲染意味着&#xff0c;一旦开始渲染就无法中断&#xff0c;直到…

将某一个 DIV 块全屏展示

文章目录 需求分析 需求 上节我们研究了如何将页面中的指定 div 下载为图片&#xff1a;跳转查看 本节演技一下如何将 DIV 全屏展示 全屏展示某一个 DIV 分析 其实就是模拟键盘动作 F11 var element document.getElementById(pic) var requestMethod element.requestFullS…