【Leetcode】无重复字符的最长子串
暴力解法,枚举所有子字符串组合
输入:长度[0,n]的字符串
耗时过长---
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int len = s.size();
int ans = ;
if(s.empty()){
return ;
}
for(int i = ; i < len-; i++){
for(int j = i+; j < len; j++){
if(allUnique(s, i, j)){
ans = max(ans, j-i+);
}
}
}
return ans;
}
bool allUnique(string ss, int start, int end){
std::set<char> ss_set;
for(int i = start; i <= end; i++){
char ch = ss[i];
if(ss_set.count(ch)){
return false;
}
ss_set.insert(ss[i]);
}
return true;
}
};
第二种方法:改进暴力解法
子字符串为[i,j),左闭右开。一旦检测到新加入字符已存在于已有子字符串中,则返回当前子字符串长度,清空子字符串,左边界右移(i+1),重新生成新的子字符串。
依然耗时过长
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int len = s.size();
std::cout << "len is : " << len << std::endl;
int ans = ;
std::set<char> ss_set;
int begin = ;
if(s.empty()){
return ;
}
else{
while(begin < len-) {
//std::cout << "begin is : " << begin << std::endl;
int tmp = ;
ss_set.clear();
for(int j = begin; j < len; j++){
if(ss_set.count(s[j])){
break;
}
ss_set.insert(s[j]);
tmp++;
}
begin = begin + ;
ans = max(ans, tmp);
}
}
return ans;
}
};
第三种:滑窗法
改进第二种方法。子字符串为[i,j),左闭右开。一旦检测到新加入字符已存在于已有子字符串中,则返回当前子字符串长度,删除begin位置的字符,窗口右移(i+1,count-1),新加入字符与窗口中的元素进行对比。
耗时94ms,消耗内存21.3MB
TIP:
1. 通过使用 HashSet 作为滑动窗口,我们可以用 O(1) 的时间来完成对字符是否在当前的子字符串中的检查;
2. 滑动窗口是数组/字符串问题中常用的抽象概念。 窗口通常是在数组/字符串中由开始和结束索引定义的一系列元素的集合,即 [i, j)(左闭,右开)。而滑动窗口是可以将两个边界向某一方向“滑动”的窗口。例如,我们将 [i, j) 向右滑动 11 个元素,则它将变为 [i+1,j+1)(左闭,右开)。
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int len = s.size();
std::set<char> ss_set;
int ans = , begin = , count = , index = ;
set<char>::const_iterator iter;
if(s.empty()){
return ;
}
else{
while(begin < len-) {
for(int j = index; j < len; j++){
if(ss_set.count(s[j])){
index = begin + count;
break;
}
ss_set.insert(s[j]);
count++;
}
// for(iter = ss_set.begin(); iter != ss_set.end(); iter++){
// std::cout << *iter << " " ;
// }
// std::cout << std::endl;
ss_set.erase(s[begin]);
begin = begin + ;
ans = max(ans, count);
count = count - ;
}
}
return ans;
}
};
滑窗法比较清晰的表达,引入变量i,j表示窗口的范围。
注意 i++ 和 ++i 的区别
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int len = s.size();
std::set<char> ss_set;
int ans = , i = , j = ;if(s.empty()){
return ;
}
else{
while(i < len && j < len){
if(!ss_set.count(s[j])){
ss_set.insert(s[j++]);
ans = max(ans, j-i);
}
else{
ss_set.erase(s[i++]);
}
}
}
return ans;
}
};
优化滑窗法
我们可以定义字符到索引的映射,而不是使用集合来判断一个字符是否存在。 当我们找到重复的字符时,我们可以立即跳过该窗口。
也就是说,如果 s[j] 在 [i,j) 范围内有与 j′ 重复的字符,我们不需要逐渐增加 i 。 我们可以直接跳过 [i,j′] 范围内的所有元素,并将 ii 变为 j' + 1j′+1。
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int len = s.size();
int ans = , i = , j = ;
map<char, int> str_map;
for(j; j < len; j++){
if(str_map.count(s[j])){
i = max(i, str_map.find(s[j])->second);
}
ans = max(ans, j - i + );
str_map[s[j]] = j+; //窗口右边界右移
}
return ans;
}
};
【Leetcode】无重复字符的最长子串的更多相关文章
- [LeetCode]无重复字符的最长子串
给定一个字符串,找出不含有重复字符的最长子串的长度. 示例 1: 输入: "abcabcbb" 输出: 3 解释: 无重复字符的最长子串是 "abc",其长度为 ...
- leetcode无重复字符的最长子串
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc&qu ...
- LeetCode 无重复字符的最长子串(探索字节跳动)
题目描述 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "a ...
- leetcode 无重复字符的最长子串 python实现
这道题需要借助哈希查找key的O(n) 时间复杂度, 否则就会超时 初始化一个 哈希表\字典 dic 头指针start 初始为0 当前指针 cur 初始为0 最大长度变量 l 初始为0 用cur变量 ...
- Leetcode(三)无重复字符的最长子串
3. 无重复字符的最长子串 题目描述 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最 ...
- 【LeetCode题解】3_无重复字符的最长子串(Longest-Substring-Without-Repeating-Characters)
目录 描述 解法一:暴力枚举法(Time Limit Exceeded) 思路 Java 实现 Python 实现 复杂度分析 解法二:滑动窗口(双指针) 思路 Java 实现 Python 实现 复 ...
- 【LeetCode】Longest Substring Without Repeating Characters(无重复字符的最长子串)
这道题是LeetCode里的第3道题. 题目描述: 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: "abcabcbb" 输出: 3 解释: ...
- LeetCode Golang 3. 无重复字符的最长子串
3. 无重复字符的最长子串 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串 ...
- Leetcode(3)无重复字符的最长子串
Leetcode(3)无重复字符的最长子串 [题目表述]: 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 第一种方法:暴力 执行用时:996 ms: 内存消耗:12.9MB 效果: ...
- 【LeetCode】无重复字符的最长子串【滑动窗口法】
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: "abcabcbb"输出: 3 解释: 因为无重复字符的最长子串是 "abc&quo ...
随机推荐
- 第二次靶场练习:cookie注入
cookie注入 本文章目的是对相关的黑客内容进一步了解,如有人违反相关的法律法规,本人概不负责 一.学习目的: 利用手工注入网站 利用sqlmab注入 二.附件说明 靶场网址:http://120. ...
- Django在根据models生成数据库表时报错: __init__() missing 1 required positional argument: 'on_delete'
原因: 在django2.0后,定义外键和一对一关系的时候需要加on_delete选项,此参数为了避免两个表里的数据不一致问题,不然会报错:TypeError: __init__() missing ...
- Groovy学习笔记-使用多赋值
1.方法返回多个结果:返回数组,将多个变量逗号隔开,放在左侧圆括号中 def splitName (fullName) { fullName.split(' ') } def (firstName, ...
- Windows MySQL测试数据库employees的导入
一: 首先下载employees测试数据库 https://launchpad.net/test-db/ 二:用文本编辑器打开其中的employees.sql文件,将第38行的set storage_ ...
- [C# 基础知识系列]专题五:当点击按钮时触发Click事件背后发生的事情 (转载)
当我们在点击窗口中的Button控件VS会帮我们自动生成一些代码,我们只需要在Click方法中写一些自己的代码就可以实现触发Click事件后我们Click方法中代码就会执行,然而我一直有一个疑问的—— ...
- Nginx+Tomcat配置负载均衡(一)
关于负载均衡原理方面的知识点不在本文讨论范畴,本文主要就负载均衡配置过程中的细节部分配置做详细说明. 本次负载均衡大致的配置如下: 环境 : WIN7 + VM虚拟机3台(centos6.5) Ngi ...
- 监测NGINX服务的shell脚本
Nginx 虽然处理并发量比 apache 确实要强点,但它这种 php-cgi 模式不是太稳定,这点网上也有朋友总结了,我在实现项目中也感受到了. 偶尔会出现以下情况的:php-cgi 进程突然消失 ...
- easyui-tree-url-param
远古写法 url后面加参数?param1=1¶m2=2 动态添加 onBeforeLoad: function (node, param) { param.param1= 1, par ...
- git教程:添加远程仓库
转自: 添加远程仓库 现在的情景是,你已经在本地创建了一个Git仓库后,又想在GitHub创建一个Git仓库,并且让这两个仓库进行远程同步,这样,GitHub上的仓库既可以作为备份,又可以让其他人通过 ...
- Charles Map Local 中文显示乱码问题
最近在迁移客户端的业务,用React Native实现,在用本地数据测试Android的时候,遇到到中文乱码的问题.是因为编码问题. 一.首先看看文件编码是否是UTF-8,我的电脑是安装了Sublim ...