题解 | #分品种#
分品种
https://www.nowcoder.com/practice/9af4e93b04484df79d4cc7a863343b0b
- 题目考察的知识点 : 贪心算法,双指针
- 题目解答方法的文字分析:
- 创建一个长度为 26 的数组
last
,用于记录每个字母在字符串s
中最后出现的位置。 - 遍历字符串
s
,对于每个字母,将其最后出现的位置记录到last
数组中。 - 使用双指针技巧来计算每个子串的长度。具体而言,遍历字符串
s
,并记录当前待划分子串的起始位置start
和结束位置end
,其中end
表示当前待划分子串中最后一个字母最后出现的位置。 - 如果当前位置
i
等于end
,说明当前子串已经达到最优划分,可以将其长度添加到结果列表partition
中,并将指针start
更新为end + 1
,开始处理下一个待划分子串。
- 本题解析所用的编程语言: Python
- 完整且正确的编程代码
class Solution: def partitionLabels(self, s: str) -> List[int]: n = len(s) last = [-1] * 26 # 记录每个字母在字符串 s 中最后出现的位置 for i in range(n): last[ord(s[i]) - ord('a')] = i partition = [] start, end = 0, 0 # 使用双指针技巧计算每个子串的长度 for i in range(n): end = max(end, last[ord(s[i]) - ord('a')]) if i == end: partition.append(end - start + 1) start = end + 1 return partition
牛客高频top202题解系列 文章被收录于专栏
记录刷牛客高频202题的解法思路