【LeetCode】763-划分字母区间
title: 763-划分字母区间
date: 2019-04-15 21:10:46
categories: LeetCode
tags:
- 字符串
 - 贪心思想
 - 双指针
 
题目描述
字符串 S 由小写字母组成。我们要把这个字符串划分为尽可能多的片段,同一个字母只会出现在其中的一个片段。返回一个表示每个字符串片段的长度的列表。
示例 1:
输入: S = "ababcbacadefegdehijhklij"
输出: [9,7,8]
解释:
划分结果为 "ababcbaca", "defegde", "hijhklij"。
每个字母最多出现在一个片段中。
像 "ababcbacadefegde", "hijhklij" 的划分是错误的,因为划分的片段数较少。
注意:
S的长度在[1, 500]之间。S只包含小写字母'a'到'z'。
解题思路
假设我们有一个片段是符合要求的,我们给这个片段设一个标签叫a,那字母a最后出现的位置肯定也在这个片段中(如果不在这个片段中,而在其他的地方出现了,就不符合题目一个字母只在一个片段出现的要求)。
在两个a之间,一般来讲也会有其他字母,同理,在这期间其他字母最后一次出现也要包含在这个片段中,这就会导致这个符合要求的片段扩张一部分。举个例子,原字符串是“abccaddbeffe”,则第一个符合要求的片段是“abccaddb”。
利用上述这个思想,我们可以使用如下方法来解题:
- 构造一个数组,存放给定字符串
s中,每个字符最后出现的索引 - 设置两个指针
start和end分别表示符合要求的片段的开始索引和结束索引 - 按字符遍历字符串,不断更新
end的值,直到i == end说明已经搜寻到一个符合要求的片段了,此时重置start的值 
Java 实现
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;
    }
    int start = 0, end = 0;
    List<Integer> ans = new ArrayList<>();
    for (int i = 0; i < s.length(); i++) {
        end = Math.max(end, last[s.charAt(i) - 'a']);
        if (i == end) {
            ans.add(i - start + 1);
            start = end + 1;
        }
    }
    return ans;
}
心得体会
本题贪心算法和双指针的结合
【LeetCode】763-划分字母区间的更多相关文章
- Java实现 LeetCode 763 划分字母区间(暴力)
		
763. 划分字母区间 字符串 S 由小写字母组成.我们要把这个字符串划分为尽可能多的片段,同一个字母只会出现在其中的一个片段.返回一个表示每个字符串片段的长度的列表. 示例 1: 输入: S = & ...
 - leetcode 763. 划分字母区间
		
题目描述: 字符串 S 由小写字母组成.我们要把这个字符串划分为尽可能多的片段,同一个字母只会出现在其中的一个片段.返回一个表示每个字符串片段的长度的列表. 示例 1: 输入: S = "a ...
 - LeetCode 763划分字母区间 详解
		
题目详情 字符串 S 由小写字母组成.我们要把这个字符串划分为尽可能多的片段,同一个字母只会出现在其中的一个片段.返回一个表示每个字符串片段的长度的列表. 示例 1: 输入: S = "ab ...
 - LeetCode:划分字母区间【763】
		
LeetCode:划分字母区间[763] 题目描述 字符串 S 由小写字母组成.我们要把这个字符串划分为尽可能多的片段,同一个字母只会出现在其中的一个片段.返回一个表示每个字符串片段的长度的列表. 示 ...
 - JS 之 每日一题 之 算法 ( 划分字母区间  )
		
题目详解: 字符串 S 由小写字母组成.我们要把这个字符串划分为尽可能多的片段,同一个字母只会出现在其中的一个片段.返回一个表示每个字符串片段的长度的列表. 例子: 示例 1: 输入:S = &quo ...
 - [Swift]LeetCode763. 划分字母区间 | Partition Labels
		
A string S of lowercase letters is given. We want to partition this string into as many parts as pos ...
 - 【LeetCode】数组--合并区间(56)
		
写在前面 老粉丝可能知道现阶段的LeetCode刷题将按照某一个特定的专题进行,之前的[贪心算法]已经结束,虽然只有三个题却包含了简单,中等,困难这三个维度,今天介绍的是第二个专题[数组] 数组( ...
 - [LeetCode] 763. Partition Labels 分割标签
		
A string S of lowercase letters is given. We want to partition this string into as many parts as pos ...
 - [LeetCode] Summary Ranges 总结区间
		
Given a sorted integer array without duplicates, return the summary of its ranges. For example, give ...
 
随机推荐
- 4、一个打了鸡血的for循环(增强型for循环)
			
对于循环,我们大家应该都不陌生,例如do-while循环,while循环,for循环,今天给大家介绍一个有趣的东西——打了鸡血的for循环(增强型for循环). 首先看代码,了解一下for循环的结构: ...
 - nodeJs跨域设置(express,koa2,eggJs)
			
原生跨域 var http=require('http'); var server = http.createServer(function (req,res) { res.setHeader('Ac ...
 - .NET中使用WebService,以及和一般处理程序、类库的区别
			
首先我们来看一下如何创建Web Service 首先在解决方案中新建项,选择ASP.NETWeb应用程序 然后选择一个空的项目就可以,单击确定 项目建完之后,在项目上右键-->添加-->新 ...
 - Linux 中如何查询端口被占用的情况
			
Linux如何查看端口 1.lsof -i:端口号 用于查看某一端口的占用情况,比如查看8000端口使用情况,lsof -i:8000,如下图 可以看到8000端口已经被轻量级文件系统转发服务lwfs ...
 - python的魔术方法大全
			
在Python中,所有以“__”双下划线包起来的方法,都统称为“Magic Method”(魔术方法),例如类的初始化方法 __init__ ,Python中所有的魔术方法均在官方文档中有相应描述,这 ...
 - 服务器小白的我,是如何将 node+mongodb 项目部署在服务器上并进行性能优化的
			
前言 本文讲解的是:做为前端开发人员,对服务器的了解还是小白的我,是如何一步步将 node+mongodb 项目部署在阿里云 centos 7.3 的服务器上,并进行性能优化,达到页面 1 秒内看到 ...
 - 简单的JavaScript字符串加密解密
			
简单的JavaScript字符串加密解密 <div> <input type="text" id="input" autofocus=&quo ...
 - 如何比较装X地回答问题 | 面试系列.1
			
公众号后台比较多同学让我写面试相关的文章,在<从面试官的角度谈谈大数据面试>也聊了很多,但是有同学吐槽说我没有把答案写上去,当时我的心里是拒绝写的,这有啥好写的,又不难,Google一大堆 ...
 - vue结合element-ui做简单版todolist
			
结合element-ui首先需要npm安装element-ui npm i element-ui -S: 然后在入口文件中引入: import ElementUI from 'element-ui'; ...
 - 马蜂窝视频编辑框架设计及在 iOS 端的业务实践
			
(马蜂窝技术公众号原创内容,ID: mfwtech) 熟悉马蜂窝的朋友一定知道,点击马蜂窝 App 首页的发布按钮,会发现发布的内容已经被简化成「图文」或者「视频」. 长期以来,游记.问答.攻略等图文 ...