Python刷leetcode--763.划分字母区间

it2026-03-30  4

时间复杂度O(N) 空间复杂度O(N)

只需要遍历两遍字符串,第一遍用hash表统计每个字母出现的最大下标。就是最晚出现的下标。 第二遍分段,每一段都记录一个left,right就是当前下标。用一个max_ind记录当前段遍历过的最大下标,如果当前坐标等于最大下标,就开始下一段的记录。并把当前的结果加入ans结果集。 [盗一下大佬的图片。]

# 字符串 S 由小写字母组成。我们要把这个字符串划分为尽可能多的片段,同一个字母只会出现在其中的一个片段。返回一个表示每个字符串片段的长度的列表。 # # # # 示例 1: # # 输入:S = "ababcbacadefegdehijhklij" # 输出:[9,7,8] # 解释: # 划分结果为 "ababcbaca", "defegde", "hijhklij"。 # 每个字母最多出现在一个片段中。 # 像 "ababcbacadefegde", "hijhklij" 的划分是错误的,因为划分的片段数较少。 # # # # # 提示: # # # S的长度在[1, 500]之间。 # S只包含小写字母 'a' 到 'z' 。 # # Related Topics 贪心算法 双指针 # 👍 330 👎 0 # 763.划分字母区间 # leetcode submit region begin(Prohibit modification and deletion) from typing import List class Solution: def partitionLabels(self, S: str) -> List[int]: ans = [] my_map = {} max_ind = 0 right = 0 left = 0 for indexi,i in enumerate(S): my_map[i] = indexi # dic = {s: index for index, s in enumerate(S)} for indexi,i in enumerate(S): max_ind = max(max_ind, my_map[S[indexi]]) if indexi == max_ind: ans.append(indexi-left+1) left = indexi + 1 return ans if __name__ == '__main__': sol = Solution() sol.partitionLabels("ababcbacadefegdehijhklij")
最新回复(0)