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

输入:长度[0,n]的字符串

耗时过长---

  1. class Solution {
  2. public:
  3. int lengthOfLongestSubstring(string s) {
  4. int len = s.size();
  5. int ans = ;
  6.  
  7. if(s.empty()){
  8. return ;
  9. }
  10.  
  11. for(int i = ; i < len-; i++){
  12. for(int j = i+; j < len; j++){
  13. if(allUnique(s, i, j)){
  14. ans = max(ans, j-i+);
  15. }
  16. }
  17. }
  18. return ans;
  19. }
  20.  
  21. bool allUnique(string ss, int start, int end){
  22. std::set<char> ss_set;
  23. for(int i = start; i <= end; i++){
  24. char ch = ss[i];
  25. if(ss_set.count(ch)){
  26. return false;
  27. }
  28. ss_set.insert(ss[i]);
  29.  
  30. }
  31. return true;
  32. }
  33. };

第二种方法:改进暴力解法

子字符串为[i,j),左闭右开。一旦检测到新加入字符已存在于已有子字符串中,则返回当前子字符串长度,清空子字符串,左边界右移(i+1),重新生成新的子字符串。

依然耗时过长

  1. class Solution {
  2. public:
  3. int lengthOfLongestSubstring(string s) {
  4. int len = s.size();
  5. std::cout << "len is : " << len << std::endl;
  6. int ans = ;
  7. std::set<char> ss_set;
  8. int begin = ;
  9.  
  10. if(s.empty()){
  11. return ;
  12. }
  13. else{
  14.  
  15. while(begin < len-) {
  16. //std::cout << "begin is : " << begin << std::endl;
  17. int tmp = ;
  18. ss_set.clear();
  19. for(int j = begin; j < len; j++){
  20. if(ss_set.count(s[j])){
  21. break;
  22. }
  23. ss_set.insert(s[j]);
  24. tmp++;
  25. }
  26. begin = begin + ;
  27. ans = max(ans, tmp);
  28. }
  29.  
  30. }
  31. return ans;
  32. }
  33.  
  34. };

第三种:滑窗法

改进第二种方法。子字符串为[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)(左闭,右开)。

  1. class Solution {
  2. public:
  3. int lengthOfLongestSubstring(string s) {
  4. int len = s.size();
  5. std::set<char> ss_set;
  6. int ans = , begin = , count = , index = ;
  7. set<char>::const_iterator iter;
  8.  
  9. if(s.empty()){
  10. return ;
  11. }
  12. else{
  13.  
  14. while(begin < len-) {
  15.  
  16. for(int j = index; j < len; j++){
  17. if(ss_set.count(s[j])){
  18. index = begin + count;
  19. break;
  20. }
  21. ss_set.insert(s[j]);
  22. count++;
  23. }
  24.  
  25. // for(iter = ss_set.begin(); iter != ss_set.end(); iter++){
  26. // std::cout << *iter << " " ;
  27. // }
  28. // std::cout << std::endl;
  29.  
  30. ss_set.erase(s[begin]);
  31. begin = begin + ;
  32. ans = max(ans, count);
  33. count = count - ;
  34. }
  35. }
  36. return ans;
  37. }
  38.  
  39. };

滑窗法比较清晰的表达,引入变量i,j表示窗口的范围。

注意 i++ 和 ++i 的区别

  1. class Solution {
  2. public:
  3. int lengthOfLongestSubstring(string s) {
  4. int len = s.size();
  5. std::set<char> ss_set;
  6. int ans = , i = , j = ;if(s.empty()){
  7. return ;
  8. }
  9. else{
  10. while(i < len && j < len){
  11. if(!ss_set.count(s[j])){
  12. ss_set.insert(s[j++]);
  13. ans = max(ans, j-i);
  14. }
  15. else{
  16. ss_set.erase(s[i++]);
  17. }
  18. }
  19. }
  20. return ans;
  21. }
  22.  
  23. };

优化滑窗法

我们可以定义字符到索引的映射,而不是使用集合来判断一个字符是否存在。 当我们找到重复的字符时,我们可以立即跳过该窗口。

也就是说,如果 s[j] 在 [i,j) 范围内有与 j′ 重复的字符,我们不需要逐渐增加 i 。 我们可以直接跳过 [i,j′] 范围内的所有元素,并将 ii 变为 j' + 1j′+1。

  1. class Solution {
  2. public:
  3. int lengthOfLongestSubstring(string s) {
  4. int len = s.size();
  5. int ans = , i = , j = ;
  6. map<char, int> str_map;
  7.  
  8. for(j; j < len; j++){
  9. if(str_map.count(s[j])){
  10. i = max(i, str_map.find(s[j])->second);
  11. }
  12.  
  13. ans = max(ans, j - i + );
  14. str_map[s[j]] = j+; //窗口右边界右移
  15.  
  16. }
  17. return ans;
  18. }
  19.  
  20. };

【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. JavsScript学习---快速排序

    <script type="text/javascript"> /** * “快速排序”的思想很简单,整个排序过程只需要三步: * (1)在数据集之中,找一个基准点 * ...

  2. 今天遇到一个关于栈溢出的问题StackOverflowError

    关于这个问题个人认为是一个比较棘手的问题,因为我们每个人遇到溢出问题的原因都不一样,所以遇到这样的问题就多从问题的根本入手. 我遇到的原因是,循环多次导致的,以为我的俩个互相关联的实体类,当作查询时, ...

  3. int 转double , 转float

    Integer log = 21424344;Double log1 = log.doubleValue() / 1000000;System.out.println(log1);BigDecimal ...

  4. you-get 下载视频

    亲测有效,没在别的平台试,道理是相通的 平台:Windows 10 所需工具: python3,pip3,you-get 步骤流程: 正确安装python3,配置环境变量 (目前使用的是3.6+) 打 ...

  5. xshell连不上虚拟机

    一般都是下边这种情况 查看 虚拟机的ip   ip a 看看是否有IP地址 如果没有的话,win+r 输入services.msc 把这三个服务设为正在运行状态 #虚拟机连不上网 前戏: 查看xshe ...

  6. 三维机翼某一断面的压力系数X-Y曲线绘制——使用tecplot的extract功能

    目标:绘制三维物体表面或者某等值面上某一截断线上的压力系数X-Y曲线 Slices不光可以在一个体上切出来一个平面,还可以和一个面相交切出一条曲线,命令是在Slice Details里面的Slice ...

  7. DPDK- program_guide 2

    Data Plane Development Kit(DPDK) RTE_SDK and RTE_TARGET must be configured. ~EAL ~librte_mempool ~li ...

  8. 从CSS到houdini

    0. 前言 平时写CSS,感觉有很多多余的代码或者不好实现的方法,于是有了预处理器的解决方案,主旨是write less &do more.其实原生css中,用上css变量也不差,加上bem命 ...

  9. div 隐藏显示各种例子

    <html><head><title>jquery show()</title><script type="text/javascrip ...

  10. 不同组的id列表的汇总对比

    需求: 三个不同的dfs中存在不同的多个节点id,现在需要求出不同的dfs之间的节点对应关系,比如,哪些节点在某一个dfs,但是不在另一个dfs中 思路: 一. 如果是单纯计算dfs中节点数量,则可以 ...