leetcode763. 划分字母区间

class Solution {
public:
	vector<int> partitionLabels(string S) {
		vector<int> ans;
		if (S.empty()) return ans;
		// 依次对数组进行遍历, 先找到相应的数据的最后一个位置, 构成区间, 然后查看区间内的元素, 随时扩充区间.
		// 若找到了 就保存下来, 然后继续从下一个上一个区间的最后一个+1的位置继续进行
		for (int i = 0; i < S.size();) {
			// 最开始确定的区间 [start, end] 这个end可以扩充
			int start = i;
			// 没有判断这个end是否存在
			int end = S.find_last_of(S[start]);
			if (end == string::npos) {
				end = start;
			}
			// 当end不存在的时候, 会返回一个很大的数字. 
			// 在子区间内继续进行扩充
			for (int j = start + 1; j <= end; j++) {
				string::size_type lastPos = S.find_last_of(S[j]);
				// 如果能找到这个字母的最后一个位置
				if (lastPos != string::npos && lastPos > end) {
					// 这个是最终的end
					end = lastPos;
				}
			}
			// 要记录被扩大的区间
			ans.push_back(end - start + 1);
			// 对i进行更新
			i = end + 1;
		}
		return ans;
	}
};

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值