力扣刷题记录 -- JAVA---92--763. 划分字母区间


一、题目

在这里插入图片描述

二、代码

class Solution
{
    //等同于射气球
    public List<Integer> partitionLabels(String s) 
    {
        int[][] record= new int[26][2];
        LinkedList<Integer> return_list = new LinkedList<>(); 

        int i;
        int length;
        length =record.length;
        for(i=0;i<length;i++)
        {
            record[i][0] = -1;
            record[i][1] = -1;
            // System.out.println("   一  "+record[i][0]+"    二  "+record[i][1]);
        }
        
        length = s.length();
        int all_elements = 0;
        // System.out.println("length  "  + length  );
        
        //构造出来的已经满足顺序
        for(i=0;i<length;i++)
        {
            int temp = s.charAt(i) - 'a';
            // System.out.println("   temp   " +temp +"  s   "+s.charAt(i));
            if(record[temp][0] ==-1)
            {
                record[temp][0] = i;
                record[temp][1] = i;
                
                all_elements++;
                // System.out.println(" all_elements加一   " +i+"     "+"  all_elements  "+all_elements);
            }
            else
            {
                record[temp][1] = i;
            }
        }


        length =record.length;
        // for(i=0;i<length;i++)
        // {
        //     System.out.println("   一  "+record[i][0]+"    二  "+record[i][1]);
        // }

        //数组构造完成  下面开始寻找无重叠区间
        int[][] record_se= new int[all_elements][2];
         // System.out.println(" all_elements    "+all_elements);
        int index = 0;
        for(i=0;i<26;i++)
        {
            if(record[i][0]!=-1)
            {
                  record_se[index][0] = record[i][0];
                  record_se[index++][1] = record[i][1];
            }
        }

        // for(i=0;i<all_elements;i++)
        // {
        //     System.out.println("   一  "+record_se[i][0]+"    二  "+record_se[i][1]);
        // }
        
        Arrays.sort(record_se,(a,b)->
        {
             if(a[0] == b[0]) return Integer.compare(a[1],b[1]);
             return Integer.compare(a[0],b[0]);
        });

        // System.out.println("     ");
        // System.out.println(" 分割    ");
        // System.out.println("     ");

        // for(i=0;i<all_elements;i++)
        // {
        //     System.out.println("   一  "+record_se[i][0]+"    二  "+record_se[i][1]);
        // }

        int begin = record_se[0][0];
        int end = record_se[0][1];
        int cut_length = 0;

        for(i=1;i<all_elements;i++)
        {
            // System.out.println("  begin  " +begin);
            // System.out.println("  end  " +end);

           if(record_se[i][0]>end)
           {
                // System.out.println("  修改  " +end);

                cut_length = end - begin+1;
                begin = record_se[i][0];
                end = record_se[i][1];

                return_list.add(cut_length);
           }
           else
           {
               begin = Math.min(begin,record_se[i][0]);
               end = Math.max(end,record_se[i][1]);
           }
 
        }

        return_list.add(end - begin+1); 
        return return_list;
    }
}

三、运行结果

在这里插入图片描述

四、附录

二刷

class Solution 
{
    public List<Integer> partitionLabels(String s) 
    {
        int i;
        int length = s.length();
        int[][] record= new int[26][2];
        
        //位置从1开始  因为0是初始值
        for(i=0;i<length;i++)
        {
            int temp = s.charAt(i)-'a';
            //System.out.println(" temp " + temp);
            if(record[temp][0] != 0)
            {
                record[temp][1] = i+1;
            }
            else  
            {
                record[temp][0] = i+1;
                record[temp][1] = i+1;
            }
        }
        
        //升序
        Arrays.sort(record,(a,b)->
        {
           if(a[0] == b[0]) return Integer.compare(a[1],b[1]);
           return Integer.compare(a[0],b[0]);
        });

        List<int[]> re_list = new LinkedList<>();
        
        for(i=0;i<26;i++)
        {
            // System.out.print(" i   "+i);
            // System.out.print("    "+record[i][0]);
            // System.out.println("    "+record[i][1]);
            if(record[i][0] !=0)
            {
                //System.out.print(" 添加   ");
                int[] temp = new int[2];
                temp[0] = record[i][0];
                temp[1] = record[i][1];
                re_list.add(temp);
            }
        }
        //System.out.println("   size  "+re_list.size());

        int begin = re_list.get(0)[0];
        int end = re_list.get(0)[1];
        int length_list = re_list.size();
        //只要包含 就必然不可分割
        List<Integer> res = new LinkedList<>();
        for(i=1;i<length_list;i++)
        {
            if(re_list.get(i)[0] <end)
            {
                end = Math.max(end,re_list.get(i)[1]);
            }
            else
            {
                res.add(end-begin+1);
                begin = re_list.get(i)[0] ;
                end = re_list.get(i)[1] ;
            }
        }
        res.add(end-begin+1); 
        return res;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@白圭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值