Partition Labels-面试题

根据题目,目标是将小写字母字符串S划分为多个部分,每个字母最多出现在一个部分。示例输入S='ababcbacadefegdehijhklij',输出为[9,7,8]。解决方法采用贪心策略,从左到右遍历,以每个字母的最大索引作为可能的分割点,确定每个部分的长度。" 108062467,9999622,亚马逊日本站选品策略:线上购物特性和文化启示,"['电子商务', '亚马逊', '跨境电商', '日本市场', '选品策略']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:分割字符串使得同种字符分隔到一起

  • A string S of lowercase letters is given. We want to partition this string into as many parts as possible so that each letter appears in at most one part, and return a list of integers representing the size of these parts.
  • 给出一个小写字母的字符串。我们希望将这个字符串划分为尽可能多的部分,以便每个字母最多出现在一个部分中,并返回表示这些部分大小的整数列表。
  • Example:Input: S = “ababcbacadefegdehijhklij Output: [9,7,8]

题目分析

  • 贪心算法
  • S中最左边的一组一定包含第一个字母的全部,以第一个字母的最大索引为分割点,依次比较第一组中的所有字母的最大索引,如果比分割点的索引大,则更换分割点,分割点前的所有字母数目即为输出的第一个数
  • 第一组确定之后,将分割点后的第一个字母作为新一轮的第一个字母,继续上述的步骤

Java代码

class Solution {
    public List<Integer> partitionLabels(String S) {
        if(S.length()==0)return null;
        List<Integer> list = new ArrayList<>();//采用list存储结果,list不定长,利用add方法在链表后添加元素
        int[] word = new int[26];
        for(int i = 0;i<S.length();i++){
            word[S.charAt(i)-'a']=i;//word数组用来存储每个字母的最大索引
        }
        int start = 0,end = 0;//标记分割成小组的开始索引和结束索引
        for(int i=0;i<S.length();i++){//遍历S中的所有字母
            end = Math.max(end,word[S.charAt(i)-'a']);//将结束索引与遍历的字母的最大索引比较大小,取最大的值作为该小组的最大索引
            if(end==i){//当遍历到这个最大索引时,证明其左边字母的全部均包含在内,该索引点即为分割点
                list.add(end-start+1);
                start=end+1;//开始点为分割点的下一个字母,进行下一步的遍历
            }
        }
        return list;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值