java数据结构与算法刷题-----LeetCode763. 划分字母区间

java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.youkuaiyun.com/grd_java/article/details/123063846

文章目录

在这里插入图片描述

统计+贪心

解题思路:时间复杂度O( n n n),空间复杂度O( 26 26 26),其中26是因为字符串s的字符范围是26个字母
  1. 我们先统计每一个字符最后出现的位置。也就是字符a在字符串s中最右边的位置
  2. 然后遍历字符串s,每遍历一个字符,就获取这个字符a的最右侧位置。并统计这个最右侧的位置为curRight
  1. 如果当前字符a的位置并不是a这个字符在s中最右侧的位置aRight,那么当前位置无法划分为一个区间。因为一个每个区间不能有交集,如果在当前位置划分区间,下一个区间必定会划分字符a。我们必须令当前区间将a完全包含
  2. 而目前这个区间最好的情况,也只能是到aRight正好划分一个区间,所以只能令curRight = aRight
  1. 如果当前字符a的aRight,正好和curRight一至,说明当前区间是一个和其它区间没有交集的区间,统计答案即可
代码

在这里插入图片描述

class Solution {
    public List<Integer> partitionLabels(String s) {
        char[] strs = s.toCharArray();//获取字符数组
        int[] last = new int[26];//保存每个字母最后一次出现的位置
        //将字符串中,每个字母最后一次出现的位置记录到last相应位置
        for(int i = 0; i < strs.length; i++) last[strs[i] - 'a'] = i;
        //然后进行贪心算法,如果
        int curRight = -1;//当前右边界
        int curLeft = 0;//当前左边界
        List<Integer> res = new ArrayList<>();//保存答案
        for(int i = 0; i < strs.length; i++){
            int index = (int)(strs[i] - 'a');//获取当前字符在last数组中的下标
            //如果当前字符的最后一次出现位置 > 当前右边界。则当前右边界只能扩张
            if(last[index] > curRight) curRight = last[index];
            //如果当前i字符正好是当前右边界。说明一个符合条件的区间找到了
            if(i == curRight) {
                res.add(curRight - curLeft + 1);//将其填加到答案中
                curLeft = curRight + 1;//下一个区间的左边界从当前右边界+1位置开始
            }
        }
        return res;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

ydenergy_殷志鹏

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

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

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

打赏作者

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

抵扣说明:

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

余额充值