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)有些类似,可以理解为往同一个方向走的双指针.常用滑 ...
随机推荐
- 后台管理系统之系统操作日志开发(Java实现)
一,功能点 实现管理员操作数据的记录.效果如下 二,代码实现 基于注解的Aop日志记录 1.Log实体类 package com.ideal.manage.guest.bean.log; import ...
- virtualization - Ubuntu Budgie screen distortion in Hyper-V - Ask Ubuntu
virtualization - Ubuntu Budgie screen distortion in Hyper-V - Ask Ubuntuhttps://askubuntu.com/questi ...
- react 路由 react-router-dom
import React from 'react'; import DataList from './data' import Tr from './Tr' // import One from '. ...
- vue二次实战
vue爬坑之路 npm uninstall 模块名(删除指定模块) https://www.cnblogs.com/wisewrong/p/6255817.html vue快速入门 https://s ...
- Angular 双向数据绑定
<!DOCTYPE html><html ng-app="myApp"><head lang="en"> <meta ...
- Day 3-5 装饰器
开放-封闭原则: 封闭:已实现的功能代码块不应该被修改. 开放:对现有功能的扩展开放. 装饰器: 定义:在符合'开放-封闭'的原则下,给程序扩展其他的功能! 例:在不更改tokyo函数的情况下.给to ...
- 关于WPF中Popup中的一些用法的总结
Popup控件是一个常用的非常有用的控件,顾明思义就是弹出式控件,首先我们来看看MSDN对它的解释吧,表示具有内容的弹出窗口,这个是非常重要的控件,我们看看它的继承关系吧: System.Object ...
- Yii2后台管理系统常规单据模块最佳实践
后台管理系统的常规单据通常包括数据,页面,功能:其中数据,页面,功能又可以细分如下: 分类 二级分类 主要内容 注意事项 例如 数据 数据库迁移脚本 用于数据表生成及转态回滚 1.是否需要增 ...
- Python——POP3邮件协议
一.POP3协议用于收取邮件 二.POP3协议常用方法 user(login):想服务器发送登录名,并显示服务器的响应,表示服务器正在等待该用户的输入密码 pass_(passwd):在用户使用use ...
- Mybatis-java.lang.RuntimeException: org.apache.ibatis.exceptions.PersistenceException: ### Error building SqlSession. ### The error may exist in sqlmap/User.xml ### Cause: org.apache.ibatis.builder.B
mappers(映射器) 使用相对于类路径的资源 如:<mapper resource="sqlmap/User.xml" /> 使用完全限定路径 如:<mapp ...