暴力解法,枚举所有子字符串组合

输入:长度[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】无重复字符的最长子串的更多相关文章

  1. [LeetCode]无重复字符的最长子串

    给定一个字符串,找出不含有重复字符的最长子串的长度. 示例 1: 输入: "abcabcbb" 输出: 3 解释: 无重复字符的最长子串是 "abc",其长度为 ...

  2. leetcode无重复字符的最长子串

    给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc&qu ...

  3. LeetCode 无重复字符的最长子串(探索字节跳动)

    题目描述 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "a ...

  4. leetcode 无重复字符的最长子串 python实现

    这道题需要借助哈希查找key的O(n) 时间复杂度, 否则就会超时 初始化一个 哈希表\字典  dic 头指针start 初始为0 当前指针 cur 初始为0 最大长度变量 l 初始为0 用cur变量 ...

  5. Leetcode(三)无重复字符的最长子串

    3. 无重复字符的最长子串 题目描述 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最 ...

  6. 【LeetCode题解】3_无重复字符的最长子串(Longest-Substring-Without-Repeating-Characters)

    目录 描述 解法一:暴力枚举法(Time Limit Exceeded) 思路 Java 实现 Python 实现 复杂度分析 解法二:滑动窗口(双指针) 思路 Java 实现 Python 实现 复 ...

  7. 【LeetCode】Longest Substring Without Repeating Characters(无重复字符的最长子串)

    这道题是LeetCode里的第3道题. 题目描述: 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: "abcabcbb" 输出: 3 解释: ...

  8. LeetCode Golang 3. 无重复字符的最长子串

    3. 无重复字符的最长子串 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串 ...

  9. Leetcode(3)无重复字符的最长子串

    Leetcode(3)无重复字符的最长子串 [题目表述]: 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 第一种方法:暴力 执行用时:996 ms: 内存消耗:12.9MB 效果: ...

  10. 【LeetCode】无重复字符的最长子串【滑动窗口法】

    给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: "abcabcbb"输出: 3 解释: 因为无重复字符的最长子串是 "abc&quo ...

随机推荐

  1. 学号 20175223 《Java程序设计》第 6 周学习总结

    目录 教材学习内容总结 代码调试中的问题和解决过程 1. 编译运行时,跳过 Scanner.nextLine() 语句. 2. 提示 NullPointerException 错误. [代码托管] 学 ...

  2. linux修改默认语言

    echo $PATH #查看当前语言LANG=en_US.UTF-8 #临时修改当前语言,修改为英文echo 'LANG=en_US.UTF-8' > /etc/sysconfig/i18n # ...

  3. SpringBoot统一异常处理

    /** * 异常处理器 */ @RestControllerAdvice // public class BDExceptionHandler { private Logger logger = Lo ...

  4. 简单学完HTML+CSS+JS,现在开始看算法(第四版)----欧几里得算法

    欧几里得算法 package euclidean_algorithm; import java.util.Scanner; /** * @author ALazy_cat * 欧几里得算法的自然语言描 ...

  5. silverlight 从数据库获取到数据,动态生成XMLWEN文件,并获取文件进行操作

    // Silverlight中的独立存储是其内部的可信任的可访问文件空间,在这里你可以使用Silverlight随意的创建.读取.写入.删除目录和文件,它有一些类似于Cookie,但是它可以在客户端保 ...

  6. MS Sql Server 查询数据库中所有表数据量

    方法一: SELECT a.name,b.rows FROM sysobjects a INNER JOIN sysindexes b ON a.id=b.id ,) AND a.Type='u' O ...

  7. snprintf笔记

    在weibo上看到Laruence大神修复了一个使用snprintf的bug (http://t.cn/Rm6AuFh) 引起了TK教主的关注.TK教主着重提到了在windows下snprintf与_ ...

  8. 并发编程心得--synchronized

    根据业务需求解决并完善并发问题-- IWMS仓库系统不考虑并发那么大的情况下,我想到的有2种并发解决方案. 1.在同时请求时,给需要操作的保存接口添加synchronized 同步方式,同步保存方法, ...

  9. ideal的maven工程启动时老是报错,提示web.xml里面的监听器找不到,但是实际又是存在的

    -X clean compile package -Dmaven.repo.local=D:\repository-pss -Dmaven.test.skip=true maven仓库地址

  10. mininet的学习之二-----miniedit可视化

    安装ryu git clone git://github.com/osrg/ryu.git cd ./ryu  sudo python setup.py install mininet可视化 git ...