763. Partition Labels

我一开始看数据范围很小,没怎么想就直接暴力了。
暴力的思路是:
对于每一段S的前缀,这个前缀中的每一个字母都不应该在前缀的补集中出现,所以直接循环i:0 to S.length然后对于每一次循环,再循环前缀中的每一个字母,判断是否在后面出现,如果出现就
说明该前缀不合适继续向后循环,如果没有出现就加入到vector里,并且下一次判断前缀时直接从sum(vector) 开始,所以时间复杂度应该是小于 n2 的。
class Solution {
public:
vector<int> partitionLabels(string S) {
vector<int> ans;
int len = S.size();
int last = ;
int ex = ;
for(int i=;i<len;i++)
{
for(int j=ex;j<=i;j++)
{
bool p = false;
for(int k=i+;k<len;k++)
{
if(S[j] == S[k]) {
p = true;
break;
}
}
if(p) {
break;
}
if(j == i) {
ans.push_back(i + - ex);
ex = i+;
}
}
}
return ans;
}
};
线性复杂度的思路:
后来觉得这样不太好,其实在读题的时候就隐约觉得有O(n)的解法,所以事后想了一下,在一开始先处理每一种字母最后出现的位置。
然后遍历S时维护一个已遍历前缀中的字母所出现的最大位置,称为lastpos,当遍历到i == lastpos时,说明该前缀中的所有字母都只出现在该前缀。加入vector。
所以时间复杂度是2n
class Solution {
public:
vector<int> partitionLabels(string S) {
vector<int> ans;
int last[];
for(int i=;i<S.size();i++)
{
last[S[i]-'a'] = i;
}
int lastpos = , ex = ;
for(int i=;i<S.size();i++)
{
lastpos = max(lastpos, last[S[i]-'a']);
if(lastpos == i) {
ans.push_back(i + - ex);
ex = i + ;
}
}
return ans;
}
};
763. Partition Labels的更多相关文章
- LC 763. Partition Labels
A string S of lowercase letters is given. We want to partition this string into as many parts as pos ...
- [LeetCode] 763. Partition Labels 分割标签
A string S of lowercase letters is given. We want to partition this string into as many parts as pos ...
- 763. Partition Labels 相同字母出现在同一块中,且块数最多
[抄题]: A string S of lowercase letters is given. We want to partition this string into as many parts ...
- 【LeetCode】763. Partition Labels 解题报告(Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 解题方法 日期 题目地址:https://leetcode.com/pr ...
- Leetcode 763. Partition Labels
思路:动态规划.对于属于coins的coin,只要知道amount-coin至少需要多少个货币就能表示,那么amount需要的货币数目=amount-coin需要的货币数目+1:如果amount-co ...
- [LeetCode] Partition Labels 分割标签
A string S of lowercase letters is given. We want to partition this string into as many parts as pos ...
- [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 - Partition Labels
A string S of lowercase letters is given. We want to partition this string into as many parts as pos ...
- LeetCode编程训练 - 滑动窗口(Sliding Window)
滑动窗口基础 滑动窗口常用来解决求字符串子串问题,借助map和计数器,其能在O(n)时间复杂度求子串问题.滑动窗口和双指针(Two pointers)有些类似,可以理解为往同一个方向走的双指针.常用滑 ...
随机推荐
- Python之异常处理(执行python文件时传入参数)
使用sys模块 使用sys模块里的argv参数,用来保存参数值 import sys #sys.argv的作用是获取到运行python文件时,传入的参数 #默认如果运行python文件不传参数,arg ...
- Centos 7 关闭selinux and firewall
关闭selinx,重启生效 修改文件 /etc/selinux/config 修改 SELINUX=disabled getenforce #查selinux状态 setenforce #关闭seli ...
- ascii、unicode、utf-8、gbk 区别
原文:https://blog.csdn.net/u010262331/article/details/46013905 ASCII:遇上0×10, 终端就换行: 遇上0×07, 终端就向人们嘟嘟叫: ...
- springboot注解@SpringBootApplication分析
@SpringBootApplication注解用在Spring Boot的入口类上面,是Spring Boot提供的应用启动相关的注解. 直接上注解的源码: @Target(ElementType. ...
- ssh登录
ssh 用户名@IP地址 -p 端口号 ssh root@127.0.0.1 -p 2222
- [转帖]windows+xshell+xming访问非桌面版Linux服务器
windows+xshell+xming访问非桌面版Linux服务器 2016年06月05日 00:09:11 jxxiaohou 阅读数:11996 标签: Linux 更多 个人分类: Linux ...
- php分割中文字符串为数组的简单例子
近日在做东西时,遇到要把中文字符进行逐字分割,试了很多方法,都不行,后来发现了一个超简单的方法: 分割字符串很简单,主要是用到函数preg_match_all.当处理含有中文的字符串时,可以用如下的方 ...
- 重写TreeView模板来实现数据分层展示(一)
总想花些时间来好好总结一下TreeView这个WPF控件,今天来通过下面的这几个例子来好好总结一下这个控件,首先来看看一个常规的带虚线的TreeView控件吧,在介绍具体如何完成之前首先来看看最终实现 ...
- 莫烦keras学习自修第四天【分类问题】
1.代码实战 #!/usr/bin/env python #! _*_ coding:UTF-8 _*_ # 导入numpy import numpy as np np.random.seed(133 ...
- echo显示颜色
如有转载,不胜荣幸.http://www.cnblogs.com/aaron-agu/ [;;34m hello aaron \[0m”