自学内容网 自学内容网

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)!