问题描述

请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。

示例 1:

输入: "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。

示例 2:

输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。

示例 3:

输入: "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。

提示:

s.length <= 40000

解题思路(双指针)

我们不妨以示例1中的字符串abcabcbb为例,找出从每一个字符开始的,不包含重复字符的最长子串,那么其中最长的那个字符串即为答案。对于示例一中的字符串,我们列举出这些结果,其中括号中表示选中的字符以及最长的字符串:
以第1个字符a开头的不含重复字符的最长子串为(abc)abcbb
以第2个字符b开头的不含重复字符的最长子串为a(bca)bcbb
以第3个字符c开头的不含重复字符的最长子串为ab(cab)cbb
以第4个字符a开头的不含重复字符的最长子串为abc(abc)bb
以第5个字符b开头的不含重复字符的最长子串为abca(bc)bb
以第6个字符c开头的不含重复字符的最长子串为abcab(cb)b
以第7个字符b开头的不含重复字符的最长子串为abcabc(b)b
以第8个字符b开头的不含重复字符的最长子串为abcabcb(b)

我们可以发现,如果我们依次递增地枚举子串的起始位置,那么子串的结束位置也是递增的
由于这种隐式的递增性,我们就可以使用双指针算法来解决
我们定义两个指针i,j,其中指针i表示枚举每个子串的起始位置,而指针j表示不包含重复子串的结束位置。
而判断子串是否包含重复元素我们可以借助Java中的set集合
在每一次循环遍历的过程中,我们会将指针i向后移动一格,相应的前面一个元素将在集合中被去除,紧接着判断以i为起始位置,j+1为结束位置的子串中是否包含重复的字符,如果不包含,那么我们就把j所指向的元素添加到集合中,并让j往后移动一位。一直遇到某个j+1使得子串中包含重复元素或者走到了字符串的尽头为止。在这过程中我们需要每次比较前面遍历过程中所得到的最大长度值与本次遍历过程中所得到的最大长度值。最终就可以得到最长不包含重复字符的子字符串。

实现代码

class Solution {public int lengthOfLongestSubstring(String s) {int result=0;               //结果变量int len=s.length();Set<Character> sets=new HashSet<Character>();       //set集合用来判断子字符串是否包含重复元素int j=-1;           //j指针即结束位置指针初值应该为-1for(int i=0;i<len;i++){if(i!=0){             //每次遍历新的起始位置,都要把前面的元素从集合中移出。sets.remove(s.charAt(i-1));}//向后移动j指针,直到遇到字符串结尾或者将要包含重复元素为止while(j+1<len && !sets.contains(s.charAt(j+1))){//当添加下一个元素,仍不包含重复元素时,可以添加进行,并把j指针后移sets.add(s.charAt(j+1));j++;}result=Math.max(result,j-i+1);          //更新结果变量}return result;}
}

剑指offer48-最长不含重复字符的子字符串(双指针经典)相关推荐

  1. 【LeetCode】剑指 Offer 48. 最长不含重复字符的子字符串

    [LeetCode]剑指 Offer 48. 最长不含重复字符的子字符串 文章目录 [LeetCode]剑指 Offer 48. 最长不含重复字符的子字符串 package offer;import ...

  2. 【剑指Offer打卡】48. 最长不含重复字符的子字符串

    剑指 Offer 48.最长不含重复字符的子字符串 JavaScript剑指Offer题解

  3. 剑指offer -- 最长不含重复字符的字符串

    题目:请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度.假设字符串中只包含'a'-'z'的字符.如在"arabcacfr"中,最长的不含重复字符的子字符 ...

  4. 求最长不含重复字符的子字符串——C++

    声明:本文原题主要来自力扣,记录此博客主要是为自己学习总结,不做任何商业等活动! 一.原题描述 剑指 Offer 48. 最长不含重复字符的子字符串 请从字符串中找出一个最长的不包含重复字符的子字符串 ...

  5. 字符串左侧补0_(48)C++面试之最长不含重复字符的子字符串(动态规划)

    // 面试题48:最长不含重复字符的子字符串 // 题目:请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子 // 字符串的长度.假设字符串中只包含从'a'到'z'的字符. #inclu ...

  6. 最长不含重复字符的子字符串(C++)

    最长不含重复字符的子字符串 描述   请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度. 数据范围:s.length≤40000 示例1 输入: "abcabcb ...

  7. 面试题48:最长不含重复字符的子字符串

    目录 1.动态规划 2.滑动数组 1.动态规划 先来分析一下吧...这题我们很容易想到,假设f(i)表示以下标i结尾的s[i]中的最长不含重复字符的子字符串,那么f(i)=f(i-1)+1是不是很容易 ...

  8. 【字符串】最长不含重复字符的子字符串

    1. 题目描述 题目链接:最长不含重复字符的子字符串 2. 题目分析 我们可以看到,题目要求我们求在一个区间内不含有重复的字符串,这种区间,我们第一时间应该想到滑动窗口. 这个题目的巧妙在于:我们利用 ...

  9. 【剑指offer】最长不含重复字符的子字符串

    题目: * 面试题48:请从字符串中找出一个最长的不包含重复字符的子字符串, * 计算该最长子字符串的长度.假设字符串中只包含从'a'到'z'的字符. * 例如,在字符串中'arabcacfr',最长 ...

最新文章

  1. 小狗钱钱_✅每次构建待办事项列表应用程序时,都会有一只小狗? 死了?
  2. 【Android 逆向】Android 中常用的 so 动态库 ( libdvm.so | libart.so | libandroid_runtime.so | libandroidfw.so )
  3. __cdecl __fastcall与__stdcall
  4. 常用脚本--查看数据库文件大小
  5. 又论社区风气, 与程序员是干嘛地的.
  6. 作者:熊赟,博士,复旦大学计算机科学技术学院副教授。
  7. opencv roberts算子_图像之HOG特征描述算子-行人检测
  8. Android View的绘制机制流程深入详解(一)
  9. mysql三高讲解(二)2.9: mysql示例数据库sakia database的使用
  10. python加减乘除符号_Python项目如何合理组织规避import天坑
  11. android安全string,[求助]Android Xposed 有没有可以将String转换成Method类型的方法
  12. primefaces教程_PrimeFaces教程
  13. php两次跳转,小程序使用函数节流解决页面多次跳转问题
  14. 先写接口文档还是先开发
  15. 迅雷离线下载分享网站
  16. 计算机社团感恩节免费维修周策划书,【关于感恩节的活动策划】大学感恩节活动策划案_早教感恩节活动策划方案_(2)_亲亲宝贝网...
  17. 深度剖析U8系统前后台数据关系-王成军-专题视频课程
  18. 【个人博客】Hexo个人博客搭建与配置详细教程 + Fluid主题 + Gitee发布
  19. 炫酷按钮《html》
  20. 【小程序】如何实现一个可折叠的列表

热门文章

  1. 工信部:不得利用“携号转网”实施恶性竞争行为
  2. 放弃第三方?苹果正自研iPhone调制解调器芯片
  3. npm WARN stylus-loader@3.0.2 requires a peer of stylus@>=0.52.4 but none is installed. You must inst
  4. request.META里包含了哪些数据?
  5. vscode remote 第三方库_分钟将vscode撸成小霸王
  6. php是单线程吗,php语言是单线程吗?
  7. java socket 全双工_java socket实现全双工通信
  8. Memcache 客户端
  9. Docker : Docker创建自定义网桥
  10. 95-190-452-源码-window-Trigger-ContinuousEventTimeTrigger