Leetcode763 Partition Labels
题目描述
A string S
of lowercase letters is given. We want to partition this string into as many parts as possible so that each letter appears in at most one part, and 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.
Note:
S
will have length in range[1, 500]
.S
will consist of lowercase letters ('a'
to'z'
) only.
思路
将每一个字符与其对应的位置放入HashMap中,两个指针,start和end,end取end本身和所处理字符的位置中较大的那个值。如果i==end,则说明该字符串截取完毕,end-start+1为当前字符串得分长度并放入ans(list)中,直到最后一个字符循环结束。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lyGJV6F7-1591445047496)(C:\Users\wangq\AppData\Roaming\Typora\typora-user-images\image-20200517211029939.png)]
代码
class Solution {
public List<Integer> partitionLabels(String S) {
HashMap<Character, Integer> map = new HashMap<>();
for(int i=0;i<S.length();i++){
map.put(S.charAt(i),i);
}
List<Integer> ans = new ArrayList<>();
int start = 0;
int end = 0;
for(int i=0;i<S.length();i++){
end = Math.max(end,map.get(S.charAt(i)));
if(i == end){
ans.add(end - start + 1);
start = end +1;
}
}
return ans;
}
}