我一开始看数据范围很小,没怎么想就直接暴力了。

暴力的思路是:

    对于每一段S的前缀,这个前缀中的每一个字母都不应该在前缀的补集中出现,所以直接循环i:0 to S.length然后对于每一次循环,再循环前缀中的每一个字母,判断是否在后面出现,如果出现就

    说明该前缀不合适继续向后循环,如果没有出现就加入到vector里,并且下一次判断前缀时直接从sum(vector) 开始,所以时间复杂度应该是小于 n的。

 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的更多相关文章

  1. LC 763. Partition Labels

    A string S of lowercase letters is given. We want to partition this string into as many parts as pos ...

  2. [LeetCode] 763. Partition Labels 分割标签

    A string S of lowercase letters is given. We want to partition this string into as many parts as pos ...

  3. 763. Partition Labels 相同字母出现在同一块中,且块数最多

    [抄题]: A string S of lowercase letters is given. We want to partition this string into as many parts ...

  4. 【LeetCode】763. Partition Labels 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 解题方法 日期 题目地址:https://leetcode.com/pr ...

  5. Leetcode 763. Partition Labels

    思路:动态规划.对于属于coins的coin,只要知道amount-coin至少需要多少个货币就能表示,那么amount需要的货币数目=amount-coin需要的货币数目+1:如果amount-co ...

  6. [LeetCode] Partition Labels 分割标签

    A string S of lowercase letters is given. We want to partition this string into as many parts as pos ...

  7. [Swift]LeetCode763. 划分字母区间 | Partition Labels

    A string S of lowercase letters is given. We want to partition this string into as many parts as pos ...

  8. LeetCode - Partition Labels

    A string S of lowercase letters is given. We want to partition this string into as many parts as pos ...

  9. LeetCode编程训练 - 滑动窗口(Sliding Window)

    滑动窗口基础 滑动窗口常用来解决求字符串子串问题,借助map和计数器,其能在O(n)时间复杂度求子串问题.滑动窗口和双指针(Two pointers)有些类似,可以理解为往同一个方向走的双指针.常用滑 ...

随机推荐

  1. jvisualvm远程监控 visualgc插件 不受此jvm支持问题

    https://yq.aliyun.com/ziliao/478212 1.修改远程服务器上java设置 vi $JAVA_HOME/jre/lib/security/java.policy    在 ...

  2. 文件传输协议FTP、SFTP和SCP

    网络通信协议分层 应用层: HTTP(Hypertext Transfer Protocol 超文本传输协议,显示网页) DNS(Domain Name System) FTP(File Transf ...

  3. spring遇到的Error applying BeanValidation relational constraints

    spring3.1+hibernate4集成测试时遇到的问题: log4j:WARN No appenders could be found for logger (org.springframewo ...

  4. SQL Server中JOIN的使用方法总结

    JOIN 分为:内连接(INNER JOIN).外连接(OUTER JOIN).其中,外连接分为:左外连接(LEFT OUTER JOIN).右外连接(RIGHT OUTER JOIN).全外连接(F ...

  5. [转帖]Linux分页机制之概述--Linux内存管理(六)

    Linux分页机制之概述--Linux内存管理(六) 2016年09月01日 19:46:08 JeanCheng 阅读数:5491 标签: linuxkernel内存管理分页架构更多 个人分类: ┈ ...

  6. 【学亮IT手记】使用Map代替switch...case语句

  7. Spring的Bean配置

    IOC和DI 网上概念很多,感兴趣可以去搜一搜,在这里我就给个比喻: IOC:以前我们买东西都要去商店买,用了IOC之后,我们只要在门口放个箱子, Spring就会给我相应商品,ಠᴗಠ 举个例子 cl ...

  8. python之路--管道, 事件, 信号量, 进程池

    一 . 管道 (了解) from multiprocessing import Process, Pipe def f1(conn): # 管道的recv 里面不用写数字 from_main_proc ...

  9. React Native & Google & Proxy

    React Native & Google & Proxy https://snack.expo.io/ https://expo.io/snacks/@xgqfrms https:/ ...

  10. python设计模式第十七天【解释器模式】

    1.应用场景 (1)解释预先定义的文法 2.代码实现 #!/usr/bin/env python #!_*_ coding:UTF-8 _*_ from abc import ABCMeta, abs ...