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

leetcode763.划分字母区间

标签:哈希表    合并区间

给你一个字符串 s 。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。注意,划分结果需要满足:将所有划分结果按顺序连接,得到的字符串仍然是 s 。返回一个表示每个字符串片段的长度的列表。

示例 1:

输入:s = "ababcbacadefegdehijhklij"
输出:[9,7,8]

示例 2:

输入:s = "eccbbbbdec"
输出:[10]

思路:遍历字符串,得到每个字母第一次和最后一次出现的下标位置。存放在map中;map<字母,[字母第一次出现位置,字母最后一次出现位置]>   为保证题目“同一字母最多出现在一个片段中”,合并所有字母出现区间,即可得到最后的片段数。该题用到了leetcode56.合并区间-CSDN博客合并区间知识。

List<Integer> ret=new ArrayList<>();
    public List<Integer> partitionLabels(String s) {
        Map<Character,List<Integer>> map=new HashMap<>();
        for(int i=0;i<s.length();i++){
            if(!map.containsKey(s.charAt(i))){
                List<Integer> temp=new ArrayList<>();
                temp.add(i);
                temp.add(i);
                map.put(s.charAt(i),temp);
            }
            else{
                List<Integer> ret=map.get(s.charAt(i));
                ret.set(ret.size()-1,i);
                map.put(s.charAt(i),ret);
            }
        }
        Set<Character> set=map.keySet();
        List<List<Integer>> lis=new ArrayList<>();
        for(Character key:set){
            lis.add(map.get(key));
        }
        merge(lis);
        return ret;
    }

    // 合并区间方法(leetcode56)
    public void merge(List<List<Integer>> intervals) {
        Collections.sort(intervals,new Comparator<List<Integer>>(){
            public int compare(List<Integer> o1,List<Integer> o2){
                return o1.get(0)-o2.get(0);
            }});
        int i=1;
        for(i=1;i<intervals.size();i++){
            if(intervals.get(i).get(0)>=intervals.get(i-1).get(0)&&intervals.get(i).get(0)<=intervals.get(i-1).get(1)){
                intervals.get(i).set(0,Math.min(intervals.get(i-1).get(0),intervals.get(i).get(0)));
                intervals.get(i).set(1,Math.max(intervals.get(i-1).get(1),intervals.get(i).get(1)));
            }
            else
                ret.add(intervals.get(i-1).get(1)-intervals.get(i-1).get(0)+1);
        }
        // 添加最后一个区间
        ret.add(intervals.get(i-1).get(1)-intervals.get(i-1).get(0)+1);
    }


http://www.kler.cn/a/511848.html

相关文章:

  • 【博客之星2024年度总评选】年度回望:我的博客之路与星光熠熠
  • Spring6.0新特性-HTTP接口:使用@HttpExchange实现更优雅的Http客户端
  • elasticsearch基础
  • 《汽车维护与修理》是什么级别的期刊?是正规期刊吗?能评职称吗?
  • 大模型GUI系列论文阅读 DAY1:《基于大型语言模型的图形用户界面智能体:综述》
  • 基于springboot的口腔管理平台
  • Android 存储进化:分区存储
  • 【博客之星2024年度总评选】年度回望:我的博客之路与星光熠熠
  • Android 极光推送快速开发集成指南(1)
  • Grafana系列之Dashboard:新增仪表板、新增变量、过滤变量、变量查询、导入仪表板、变量联动、Grafana Alert
  • 第9章:Python TDD解决货币对象相等性比较难题
  • python爬虫报错日记
  • 初始JavaEE篇 —— 快速上手 SpringBoot
  • 【Redis】Redis 集群中节点之间如何通信?
  • [cg] glProgramBinary
  • JavaScript系列(35)-- WebSocket应用详解
  • Redis系列之底层数据结构字典Dict
  • 图像处理|顶帽操作
  • Kivy App开发之UX控件Bubble气泡
  • 使用redis-cli命令实现redis crud操作
  • Meta标签教程:提升网站SEO与用户体验的利器
  • 人工智能之数学基础:线性代数中的线性相关和线性无关
  • windows下使用docker执行器并配置 hosts 解析
  • Agent AI: 强化学习,模仿学习,大型语言模型和VLMs在智能体中的应用
  • 2024年第十五届蓝桥杯青少组国赛(c++)真题—快速分解质因数
  • 仿 RabbitMQ 的消息队列2(实战项目)