LeetCode 763. Partition Labels

LeetCode 763. Partition Labels

  • 这题挺考究思维的,一开始我也不会,也是看别人的分析自己再重新思考和编码

题目描述

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 1:
Input: S = "ababcbacadefegdehijhklij"
Output: [9,7,8]
Explanation:
The partition is "ababcbaca", "defegde", "hijhklij".
This is a partition so that each letter appears in at most one part.
A partition like "ababcbacadefegde", "hijhklij" is incorrect, because it splits S into less parts.
Note:

S will have length in range [1, 500].
S will consist of lowercase letters ('a' to 'z') only.

解题思路

  • 题干要求尽可能地分成数量多的分区,那么同样的字母,第一次出现所在的位置和最后一次出现所在的位置之间形成的区间必须在一个分区内,但这个区间里可能包含其它字母,会动态影响分区的大小。比如defegdehijhklij,第一个字母为d,两个d之间包含e,f,g所以第一个分区为defegde,需要动态扩展分区大小,直到遍历的下标刚好等于区间所有字母出现的最后一次的下标的最大值。

算法描述

  • 记录每个字母最后出现的下标 last[]
  • 初始化分区开始和结束下标start,end
  • 遍历题目给的字符串,将Math.max(该字母出现的最后一次下标值,end)赋值给end,更新end的值,直到遍历的下标==end,证明找到一个分区;更新start的值为end+1
  • 重复第三步,直到遍历结束

代码实现-Java

 class Solution {
	    public List<Integer> partitionLabels(String S) {
	        int[] last = new int [26];
	        for(int i=0;i<S.length();i++) {
	        	last[S.charAt(i) - 'a'] = i;
	        }
	        List<Integer> result = new ArrayList<Integer>();
	        int start = 0;
	        int end = 0;
	        for(int i=0,i<S.length();i++) {
	        	end = Math.max(end, last[S.charAt(i) - 'a']);
	        	if(end == i) {
	        		result.add(end - start + 1);
	        		start = i + 1;
	        	}
	        }
	        return result;
	    }
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值