题目描述
字符串 S 由小写字母组成。把这个字符串划分为尽可能多的片段,同一个字母只会出现在其中的一个片段。返回一个表示每个字符串片段的长度的列表。
思路
贪心。
不断选择从最左边起最小的区间。
假设第一个字母是 ‘a’,那么第一个区间一定包含最后一次出现的 ’a‘。但第一个 ’a’ 和最后一个 ‘a’ 之间可能还有其他字母,这些字母会让区间变大。
对于遇到的每一个字母,去找这个字母最后一次出现的位置,用来更新当前的最小区间。
算法
定义数组 last[char] 来表示字符 char 最后一次出现的下标。
定义 anchor 和 j 来表示当前区间的首尾。
如果遇到的字符最后一次出现的位置下标大于 j,就让 j = last[char] 来拓展当前的区间。
当遍历到了当前的区间末尾(i == j)时,就把当前区间加入答案,同时将 start 设为 i + 1 去找下一个区间。
代码
时间复杂度:O(N)
空间复杂度:O(1)
一些问题
- S.charAt(i) - ‘a’ : char2Index
得到 s[i] 中存储的字符对应 last 数组中哪一个下标。
数组 last[char] 来表示字符 char 最后一次出现的下标 - S.charAt(i) - ‘0’:数字字符。