2020

it2025-07-17  8

字符串 S 由小写字母组成。我们要把这个字符串划分为尽可能多的片段,同一个字母只会出现在其中的一个片段。返回一个表示每个字符串片段的长度的列表。

示例 1:

输入:S = “ababcbacadefegdehijhklij” 输出:[9,7,8] 解释: 划分结果为 “ababcbaca”, “defegde”, “hijhklij”。 每个字母最多出现在一个片段中。 像 “ababcbacadefegde”,“hijhklij” 的划分是错误的,因为划分的片段数较少。

提示:

S的长度在[1, 500]之间。 S只包含小写字母 ‘a’ 到 ‘z’ 。

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/partition-labels 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

统计每个字母最右出现的位置到数组right中:

//统计每个字母最右index int[] right = new int[26]; for(int i = 0; i < S.length(); ++i) { right[S.charAt(i) - 'a'] = i; }

然后从左往右遍历字符串,用两个指针。l每到一个位置的时候把r右移到right[l](或者不动)。直到l和r相等就截出了一个字符串,完整代码:

class Solution { public List<Integer> partitionLabels(String S) { //统计每个字母最右index int[] right = new int[26]; for(int i = 0; i < S.length(); ++i) { right[S.charAt(i) - 'a'] = i; } List<Integer> ret = new ArrayList<>(); int l = 0; while(l < S.length()) { int r = right[S.charAt(l) - 'a'], l0 = l; while(l < r) { ++l; r = Math.max(r, right[S.charAt(l) - 'a']); } ret.add(l - l0 + 1); ++l; } return ret; } }
最新回复(0)