贪心思想之字符串切分

 先从第一个字符开始,找到最后一次该字符出现的位置,然后判断包含在这个范围之内的字符是否满足最后一次出现的位置<=lastIndex,不满足要进行重新更新lastindex;直到所有的字符都在lastindex范围之内

class Solution {
    public List<Integer> partitionLabels(String S) {
        /*按照字符最后一次出现的位置进行划分,如果下一个字符最后一次出现的位置
//在当前lastindex的里面,就不划分片段,如果不在,就从lastindex开始划分*/
        //1.先定义26个字符出现的最后一次索引位置
        int[] lastmap=new int[26];
        //2.把最后一次出现的位置都存储进去
        for(int i=0;i<S.length();i++){
            lastmap[S.charAt(i)-'a']=i;
        }
        List<Integer> res=new ArrayList<>();
        //3.开始查找满足条件的选择
        int firstIndex=0;
        while(firstIndex<S.length()){
            int lastIndex=firstIndex;
            //ababcabcc||a最后一次出现的位置5,但是c最后一次出现的位置大于5,
            //因此要更新lastIndex为c最后一次出现的位置;然后让lastindex里面的字符最后一次出现的位置都<=lastIndex;
            //作为一次切分
            for(int i=firstIndex;i<S.length()&&i<=lastIndex;i++){
                //4.求出每个字符最后一次出现的位置
               int index=lastmap[S.charAt(i)-'a'];
                //5.判断--找出每个字符最后一次出现的位置
                if(index>lastIndex){
                    lastIndex=index;
                }
            }
            //满足上述条件之后,重新开始划片
           res.add(lastIndex-firstIndex+1);
            firstIndex=lastIndex+1;
        }
        return res;
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值