leetcode763.划分字母区间
标签:哈希表 合并区间
给你一个字符串 s
。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。注意,划分结果需要满足:将所有划分结果按顺序连接,得到的字符串仍然是 s
。返回一个表示每个字符串片段的长度的列表。
示例 1:
输入:s = "ababcbacadefegdehijhklij" 输出:[9,7,8]
示例 2:
输入:s = "eccbbbbdec" 输出:[10]
思路:遍历字符串,得到每个字母第一次和最后一次出现的下标位置。存放在map中;map<字母,[字母第一次出现位置,字母最后一次出现位置]> 为保证题目“同一字母最多出现在一个片段中”,合并所有字母出现区间,即可得到最后的片段数。该题用到了leetcode56.合并区间-CSDN博客合并区间知识。
List<Integer> ret=new ArrayList<>();
public List<Integer> partitionLabels(String s) {
Map<Character,List<Integer>> map=new HashMap<>();
for(int i=0;i<s.length();i++){
if(!map.containsKey(s.charAt(i))){
List<Integer> temp=new ArrayList<>();
temp.add(i);
temp.add(i);
map.put(s.charAt(i),temp);
}
else{
List<Integer> ret=map.get(s.charAt(i));
ret.set(ret.size()-1,i);
map.put(s.charAt(i),ret);
}
}
Set<Character> set=map.keySet();
List<List<Integer>> lis=new ArrayList<>();
for(Character key:set){
lis.add(map.get(key));
}
merge(lis);
return ret;
}
// 合并区间方法(leetcode56)
public void merge(List<List<Integer>> intervals) {
Collections.sort(intervals,new Comparator<List<Integer>>(){
public int compare(List<Integer> o1,List<Integer> o2){
return o1.get(0)-o2.get(0);
}});
int i=1;
for(i=1;i<intervals.size();i++){
if(intervals.get(i).get(0)>=intervals.get(i-1).get(0)&&intervals.get(i).get(0)<=intervals.get(i-1).get(1)){
intervals.get(i).set(0,Math.min(intervals.get(i-1).get(0),intervals.get(i).get(0)));
intervals.get(i).set(1,Math.max(intervals.get(i-1).get(1),intervals.get(i).get(1)));
}
else
ret.add(intervals.get(i-1).get(1)-intervals.get(i-1).get(0)+1);
}
// 添加最后一个区间
ret.add(intervals.get(i-1).get(1)-intervals.get(i-1).get(0)+1);
}
原文地址:https://blog.csdn.net/m0_64995001/article/details/145261315
免责声明:本站文章内容转载自网络资源,如侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!