leetcode热题100.划分字母区间

Problem: 763. 划分字母区间

题目

给你一个字符串 s 。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。

注意,划分结果需要满足:将所有划分结果按顺序连接,得到的字符串仍然是 s 。

返回一个表示每个字符串片段的长度的列表。

示例 1:

输入:s = “ababcbacadefegdehijhklij”

输出:[9,7,8]

解释:

划分结果为 “ababcbaca”、“defegde”、“hijhklij” 。

每个字母最多出现在一个片段中。

像 “ababcbacadefegde”, “hijhklij” 这样的划分是错误的,因为划分的片段数较少。

示例 2:

输入:s = “eccbbbbdec”

输出:[10]

思路

由于同一个字母只能出现在同一个片段,显然一个字母出现的最后一个位置也在这个片段中;

题目中要求我们尽可能多的划分片段,所以每当我们确定了这个位置可以包含此位置之前的所有字母,那么我们一定要进行划分,这样划分数量才能最大

例如下图,在a后面切一刀才能保证最大分割
在这里插入图片描述

具体做法:
我们先计算每个字母最后出现的位置,然后遍历字符串,统计这一段字符中的字母出现的最远的位置;
当我们遍历到了这个最远位置,说明当前可以进行分割,我们将答案记录,继续遍历,直到终点。

复杂度

时间复杂度:

只遍历了两遍,所以是 O ( n ) O(n) O(n)

空间复杂度:

用到了一个字典,所以是 O ( n ) O(n) O(n)

Code

class Solution:
    def partitionLabels(self, s: str) -> List[int]:
        last = [0] * 26
        for i,ch in enumerate(s):
            last[ord(ch)- ord('a')] = i
        
        ans = []
        start = end = 0
        for i,ch in enumerate(s):
            end = max(end,last[ord(ch)-ord('a')])
            if end == i:
                ans.append(end-start+1)
                start = i+1
        return ans
### LeetCode 100 相关知识点总结 以下是基于引用内容以及常见 LeetCode 目的知识点分类和说明: #### 一、动态规划(Dynamic Programming) 动态规划是一种通过把原问分解为相对简单的子问的方式来求解复杂问的方法。 - **记忆化 DP**:用于优化递归过程中的重复计算,减少时间复杂度[^1]。 - 经典目: - `LeetCode 1262`:可被三整除的最大和,利用状态转移方程解决最大值问。 - `LeetCode 5`:最长回文子串,采用中心扩展法或动态规划方法实现字符串匹配[^4]。 #### 二、贪心算法(Greedy Algorithm) 贪心算法通常用来解决最优解问,在每一步都选择局部最优解以期望达到全局最优解。 - 特点:无需考虑后续影响,仅关注当前决策。 - 经典目: - `LeetCode 763`:划分字母区间,记录每个字符最后一次出现的位置并逐步更新结束位置。 - `LeetCode 1221`:分割平衡字符串,统计左右部分的字符数量差异来判断切割点[^3]。 #### 三、回溯算法(Backtracking) 回溯算法适用于探索所有可能的选择路径,常用于组合、排列等问。 - 基本思路:尝试构建候选解决方案,并在发现不满足条件时撤销最近一次操作。 - 经典目: - `LeetCode 17`:电话号码的字母组合,枚举所有可能的结果集合[^2]。 - `LeetCode 39/40`:组合总和系列问,使用剪枝技术提高效率。 #### 四、数组与矩阵处理 数组问是编程面试中最常见的类型之一,涉及到索引运算、边界控制等方面。 - 关键技巧:双指针、滑动窗口等高效遍历方式。 - 经典目: - `LeetCode 121`:买卖股票的最佳时机,维护最低价格变量完成单次交易利润最大化。 - `LeetCode 55/45`:跳跃游戏及其变种版本,模拟可达范围内的最远距离或者最少步数。 #### 五、链表结构 链表数据结构因其灵活性而广泛应用于实际场景中,主要考察节点间的逻辑关系调整能力。 - 核心概念:头插法、尾插法、反转链表等基本操作。 - 经典目: - `LeetCode 2`:两数相加,逆序存储数值并通过逐位累加得到最终结果。 #### 六、其他重要主 除了上述几大类之外还有许多值得深入学习的内容如下所示: - **分治策略**:将大规模问拆分成若干独立的小规模实例分别解答后再合并起来形成整体方案; - **图论基础**:包括但不限于拓扑排序、连通性检测等领域应用; - **高级搜索技术**:比如 A* 启发式寻路算法等等。 ```python def example_code(): """ 示例代码 """ pass ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

晓宜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值