代码改变世界

[LeetCode] 763. Partition Labels_Medium Tag: sort

2021-07-29 08:50  Johnson_强生仔仔  阅读(21)  评论(0编辑  收藏  举报
763. Partition Labels
Medium

You are given a string s. We want to partition the string into as many parts as possible so that each letter appears in at most one part.

Return a list of integers representing the size of these parts.

 

Example 1:

Input: s = "ababcbacadefegdehijhklij"
Output: [9,7,8]
Explanation:
The partition is "ababcbaca", "defegde", "hijhklij".
This is a partition so that each letter appears in at most one part.
A partition like "ababcbacadefegde", "hijhklij" is incorrect, because it splits s into less parts.

Example 2:

Input: s = "eccbbbbdec"
Output: [10]

 

Constraints:

  • 1 <= s.length <= 500
  • s consists of lowercase English letters.

Ideas: 其实跟[LeetCode] 56. Merge Intervals_Medium Tag: sort 原理一样,我们扫一遍s,得到每个char的first and last index, 然后再merge intervals, 最后返回intervals的差值加1即可。

 

Code:

class Solution:
    def partitionLabels(self, s: str) -> List[int]:
        d = collections.defaultdict(list)
        for index, c in enumerate(s):
            if not d[c] :
                d[c]= [index, index]
            else:
                d[c][-1] = index
        intervals = sorted(d.values())
        ans = []
        for s, e in intervals:
            if not ans or s >ans[-1][1]:
                ans.append([s, e])
            else:
                ans[-1][1] = max(ans[-1][1], e)
        return [e - s + 1 for s, e in ans]