763. 划分字母区间(中等)

news2024/11/22 17:07:08

763. 划分字母区间

  • 1. 题目描述
  • 2.详细题解
  • 3.代码实现
    • 3.1 Python
    • 3.2 Java

1. 题目描述

题目中转:763. 划分字母区间
在这里插入图片描述
在这里插入图片描述

2.详细题解

    划分字母片段,要求每个字母仅能出现在一个片段中,划分的片段数要最多。如果没有限制要最多的情况,那么划分一个片段即不划分任何新的片段即可,因此采用贪心策略:每个片段寻找最小的结束下标。
  直观思路: 寻找每个片段最小的结束下标的关键在于如何确保当前片段中的每个字母均已全部出现,因此需要记录每个字符总共出现的次数,当该片段所有字母均已出现即可判断找到最小的结束下标,即方法一:该方法首先需要遍历统计出所有字符出现的次数;其次遍历寻找最小结束下标,需要用到双指针,第一个指针(i)标记当前字符串的索引位置,第二个指针(cur_index)标记当前片段的索引位置。分为以下几种情况:1.新片段开始,当前字符计入片段,更新第一个指针位置移动1位;2.第二个指针cur_index与当前片段长度一致,即寻找到当前片段最小结束下标,第二个指针置为0;3.当前字符存在于当前片段中,减少该字符出现次数,更新第一个指针位置移动1位;4.第二个指针所指字符已全部包含在当前片段时,更新第二个指针位置移动1位;5.否则,当前字符加入当前片段,更新第一个指针位置移动1位。该方法较为直观,但实现有很多小细节,需要仔细区分各种情况的条件
   方法二:该方法不是方法一的直观思路,但却更易理解。对于每一个划分,都需要寻找最小结束下标(即该字符最后一个出现位置的索引),因此首先记录每一个字符最后一次出现位置的索引下标,当遍历一个字符时,即可找到满足该字符条件下最小的结束下标。具体的,使用三指针,一个指针标记当前遍历位置(i),剩下两个双指针标记当前片段的开始(left)与结束位置(right);当遍历一个字符c时,即可更新右指针right为max(right,c的结束位置),当遍历位置i和右指针right相遇时,即当前片段为满足条件的最小片段。

3.代码实现

3.1 Python

# 方法一:
from collections import Counter
class Solution:
    def partitionLabels(self, s: str) -> List[int]:
        word_dict = Counter(s)
        cur_queue = []
        cur_index = 0
        ans = []
        i = 0
        while i < len(s):
            c = s[i]
            if len(cur_queue) == 0:
                cur_queue.append(c)
                word_dict[c] -= 1
                i += 1
            elif len(cur_queue) == cur_index:
                ans.append(len(cur_queue))
                cur_index = 0
                cur_queue = []
            elif c in cur_queue:
                cur_queue.append(c)
                word_dict[c] -= 1
                i += 1
            elif word_dict[cur_queue[cur_index]] == 0:
                cur_index += 1
            else:
                cur_queue.append(c)
                word_dict[c] -= 1
                i += 1
        if len(cur_queue) > 0:
            ans.append(len(cur_queue))
        return ans


在这里插入图片描述

# 方法二
from collections import defaultdict
class Solution:
    def partitionLabels(self, s: str) -> List[int]:
        ans = []
        last_loc = defaultdict(int)
        for i,c in enumerate(s):
            last_loc[c] = i
        
        left, right = 0, 0
        for i,c in enumerate(s):
            right = max(right, last_loc[c])
            if i == right:
                ans.append(right-left+1)
                left = right + 1
        
        return ans

3.2 Java

class Solution {
    public List<Integer> partitionLabels(String s) {
        List<Integer> ans = new ArrayList<>();
        Map<Character, Integer> lastLoc = new HashMap<>();
        
        for (int i = 0; i < s.length(); i++) {
            lastLoc.put(s.charAt(i), i);
        }
        
        int left = 0, right = 0;
        for (int i = 0; i < s.length(); i++) {
            right = Math.max(right, lastLoc.get(s.charAt(i)));
            if (i == right) {
                ans.add(right - left + 1);
                left = right + 1;
            }
        }
        
        return ans;
    }
}

在这里插入图片描述

  执行用时不必过于纠结,对比可以发现,对于python和java完全相同的编写,java的时间一般是优于python的;至于编写的代码的执行用时击败多少对手,执行用时和网络环境、当前提交代码人数等均有关系,可以尝试完全相同的代码多次执行用时也不是完全相同,只要确保自己代码的算法时间复杂度满足相应要求即可,也可以通过点击分布图查看其它coder的code

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

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

相关文章

树-层序遍历序列构造二叉树

一、问题描述 二、实现思路 问题给出了层序遍历序列&#xff0c;我们使用队列来实现二叉树的构造过程&#xff1a; 这里注意&#xff1a;在写代码时&#xff0c;比较字符串数组内元素str和某个字符串是否相等时用str.equals("#")的操作&#xff0c;如果用 会引发比较…

派派派森03

1.JSON数据 Python数据和Json数据的相互转化 # 导入json模块 import json#准备符合json格式要求的python数据 data [{"name": "老王", "age": 16}, {"name": "张三", "age": 20}]# 通过json.dump(data)方法把pyt…

ES6-03-模版字符串、对象的简化写法

一、模版字符串 1-1、声明 反引号。 1-2、特性 1、字符串内容可以直接换行 得用号连接 2、变量拼接 现在&#xff1a; 二、对象的简化写法 ES6允许在大括号里面&#xff0c;直接写入变量和函数&#xff0c;作为对象的属性和方法。 let name milk;let chage function(){con…

文心一言 VS 讯飞星火 VS chatgpt (275)-- 算法导论20.3 2题

二、修改 vEB 树以支持带有卫星数据的关键字。如果要写代码&#xff0c;请用go语言。 文心一言&#xff1a; vEB 树&#xff08;van Emde Boas 树&#xff09;是一种用于处理稀疏位集合的高效数据结构&#xff0c;它允许在常数时间内执行查找、插入、删除和前驱/后继操作。然…

SCT53600TVB具有反向电流保护的理想二极管控制器

4.7V至65V工作范围 – 65V反向额定电压 用于外部N沟道MOSFET的电荷泵 20mV正向压降调节 12V栅极驱动电压 带启用输入 驱动高侧外部N沟道MOSFET 1μA关断电流&#xff08;EN低&#xff09; 60μA工作静态电流&#xff08;EN高&#xff09; 2.3-A峰值…

zabbix“专家坐诊”第241期问答

问题一 Q&#xff1a;华为交换机的100GE 1/0/1口的光模块收光值监测不到&#xff0c;有没有人碰到过这个问题呢&#xff1f;其他的端口都能监测到收光值&#xff0c;但是100GE 1/0/1口监测不到收光值。底层能查到&#xff0c;zabbix 6.0监控不到&#xff0c;以下是端口的报错信…

EasyRecovery2024永久免费crack激活码注册码

在数字化时代&#xff0c;数据已经成为我们生活和工作中不可或缺的一部分。无论是个人用户还是企业用户&#xff0c;都面临着数据丢失的风险。一旦数据丢失&#xff0c;可能会给我们的工作带来极大的不便&#xff0c;甚至可能对企业造成重大损失。因此&#xff0c;数据安全和恢…

Unity VR 零基础开发之 Pico4 MR

一、新建Unity2021.3.37 3D工程 二、切换到Android安卓平台 1、点击Unity编辑器左上角的Flie后&#xff0c;选择Build Setting选项。 2、弹出弹窗后&#xff0c;点击Android选项&#xff0c;然后再点击Switch Platform按钮切换成安卓平台。 3、切换完成后Android选项后面会显示…

php7.3安装phalcon扩展

php7安装3.4版本的phalcon扩展 适用于Centos6.x和Centos7.x系统&#xff0c;php使用7.1版本&#xff0c;wlnmp一键包已支持该扩展 phalcon扩展包地址&#xff1a;https://github.com/phalcon/cphalcon &#xff08;git clone 有可能连接不上&#xff09; 1、安装所需依赖&a…

Hadoop3:MapReduce源码解读之Map阶段的TextInputFormat切片机制(3)

Job那块的断点代码截图省略&#xff0c;直接进入切片逻辑 参考&#xff1a;Hadoop3&#xff1a;MapReduce源码解读之Map阶段的Job任务提交流程&#xff08;1&#xff09; 5、TextInputFormat源码解析 类的继承关系 它的内容比较少 重写了两个父类的方法 这里关心一下泛型参数…

MySQL Shell 使用指南

前言&#xff1a; MySQL Shell 是官方提供的 MySQL 周边适配组件&#xff0c;是新一代的高级客户端&#xff0c;在 MySQL 8.0 及其以后的版本得以慢慢推广应用。之前笔者因为 MySQL 8.0 用得比较少&#xff0c;一直没有详细使用过这个工具&#xff0c;近期在捣鼓 MySQL 8.0&am…

Android Compose 十:常用组件列表 监听

1 去掉超出滑动区域时的拖拽的阴影 即 overScrollMode 代码如下 CompositionLocalProvider(LocalOverscrollConfiguration provides null) {LazyColumn() {items(list, key {list.indexOf(it)}){Row(Modifier.animateItemPlacement(tween(durationMillis 250))) {Text(text…

WPF真入门教程32--WPF数字大屏项目实干

1、项目背景 WPF (Windows Presentation Foundation) 是微软的一个框架&#xff0c;用于构建桌面客户端应用程序&#xff0c;它支持富互联网应用程序&#xff08;RIA&#xff09;的开发。在数字大屏应用中&#xff0c;WPF可以用来构建复杂的用户界面&#xff0c;展示庞大的数据…

《猎杀:对决》是适合什么样的人玩 Mac电脑怎么玩《猎杀:对决》

《猎杀&#xff1a;对决》是一款集合了生存、竞技和恐怖元素的多人在线游戏&#xff0c;自推出以来受到了广大玩家的热爱。本文将详细探讨《猎杀&#xff1a;对决》适合什么样的人玩以及Mac电脑怎么玩《猎杀&#xff1a;对决》。本文将一一解析&#xff0c;帮助你了解这款游戏是…

稍微学学react

文章开始前&#xff0c;先划划水~ 今日份开心&#xff1a; 今天看之前发布的按钮npm包下载量有162次&#xff0c;早知道好好做了 今日份不开心&#xff1a; 爬岗位看到一个整体都挺满意的岗位&#xff0c;公司位置和发展大方向都好喜欢&#xff01;&#xff01;&#xff01;…

本地Nginx的安装到使用

借鉴文章 https://blog.csdn.net/weixin_44005802/article/details/135488448 1.官网下载链接&#xff1a;链接: https://nginx.org/en/download.html 2.将下载的zip包解压后&#xff0c;打开D:…\nginx-1.20.2\conf\nginx.conf&#xff0c;修改server为实际配置。 worker_pr…

Vue 封装elementUI的el-popover

1.封装公共组件 <template><div class"confirm-popover disInlineBlock ml10"><el-popover placement"bottom" v-model"visible" :trigger"triggerType"><div class"confirm-popover-popover"><…

分表策略,你真的分对了?

垂直分表方案 表的记录并不多&#xff0c;但是字段却很长&#xff0c;表占用空间很大&#xff0c;检索表的时候需要执行大量的IO&#xff0c;严重降低了性能。这时需要把大的字段拆分到另一个表&#xff0c;并且该表与原表是一对一的关系。 为什么垂直拆分之后查询性能就变快…

ROG CETRA II 降临2代RGB版 使用体验!

现在Type-C接口的设备越来越多&#xff0c;不仅是台式机开始普及&#xff0c;像NUC、笔记本、Switch、安卓手机等也都是Type-C接口了&#xff0c;所以游戏耳机方面也开始迭代。Type-C还有一个好处就是供电足以撑起降噪处理和RGB灯效&#xff0c;你懂的。今天跟大家分享的就是RO…

基于yolov5s的垃圾桶满溢检测 (附数据集与Coovally操作步骤)

本文主要内容:详细介绍了垃圾桶满溢检测整个过程&#xff0c;从创建数据集到训练模型再到预测结果全部可视化操作与分析。 文末有数据集获取方式&#xff0c;请先看检测效果 现状 在当今城市化高速发展的背景下&#xff0c;随着人口密度的增加和垃圾产生量的急剧攀升&#xff…