提示

LintCode中的相关算法题实现代码,可以在我的GithHub中下载。

题目需求

给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。

示例 1:

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

示例 2:

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

示例 3:

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

解题思路

暴力法非常简单。但它太慢了。那么我们该如何优化它呢?

在暴力法中,我们会反复检查一个子字符串是否含有有重复的字符,但这是没有必要的。如果从索引 ii 到 j - 1j−1 之间的子字符串 s_{ij}sij​ 已经被检查为没有重复字符。我们只需要检查 s[j]s[j] 对应的字符是否已经存在于子字符串 s_{ij}sij​ 中。

要检查一个字符是否已经在子字符串中,我们可以检查整个子字符串,这将产生一个复杂度为 O(n^2)O(n2) 的算法,但我们可以做得更好。

通过使用 HashSet 作为滑动窗口,我们可以用 O(1)O(1) 的时间来完成对字符是否在当前的子字符串中的检查。

滑动窗口是数组/字符串问题中常用的抽象概念。 窗口通常是在数组/字符串中由开始和结束索引定义的一系列元素的集合,即 [i, j)[i,j)(左闭,右开)。而滑动窗口是可以将两个边界向某一方向“滑动”的窗口。例如,我们将 [i, j)[i,j) 向右滑动 11 个元素,则它将变为 [i+1, j+1)[i+1,j+1)(左闭,右开)。

回到我们的问题,我们使用 HashSet 将字符存储在当前窗口 [i, j)[i,j)(最初 j = ij=i)中。 然后我们向右侧滑动索引 jj,如果它不在 HashSet 中,我们会继续滑动 jj。直到 s[j] 已经存在于 HashSet 中。此时,我们找到的没有重复字符的最长子字符串将会以索引 ii 开头。如果我们对所有的 ii 这样做,就可以得到答案。

实现代码

public class _3_lengthOfLongestSubstring {
//    public int lengthOfLongestSubstring(String s) {
//        int result=0;
//        for (int i = 0; i < s.length(); i++) {
//            for (int j = i; j < s.length(); j++) {
//                if(!hasRepeatChar(s.substring(i,j+1))){
//                    result=Math.max(result,(j-i+1));
//                }
//            }
//        }
//        return result;
//    }
//
//    private boolean hasRepeatChar(String s){
//        Set<Character> set=new HashSet<>();
//        for (int i = 0; i < s.length(); i++) {
//            if(set.contains(s.charAt(i))){
//                return true;
//            }else
//                set.add(s.charAt(i));
//        }
//        return false;
//    }public int lengthOfLongestSubstring(String s) {int n = s.length();Set<Character> set = new HashSet<>();int ans = 0, i = 0, j = 0;while (i < n && j < n) {// try to extend the range [i, j]if (!set.contains(s.charAt(j))){set.add(s.charAt(j++));ans = Math.max(ans, j - i);}else {set.remove(s.charAt(i++));}}return ans;}
}

LetCode 3 无重复字符的最大子串相关推荐

  1. LeetCode / Scala - 无重复字符最长子串 ,最长回文子串

    一.引言 LeetCode 里有一类字符子串问题,这里主要分析无重复字符的最长子串与最长回文子串,总结相关方法. 二.无重复字符最长子串 1.题目要求 给定字符串 s,要求找出字符内无重复的最长子串, ...

  2. leetcode3 无重复字符最长子串

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

  3. Leecode刷题热题HOT100(3)——无重复字符最长子串

  4. leetcode刷题:无重复字符的最长子串

    题目: 分析: 取巧解法,通过set class Solution { public:int lengthOfLongestSubstring(string s) {if(s.size() == 0) ...

  5. 【leetcode】力扣刷题(3):无重复字符的最长子串(go语言)

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

  6. 刻意练习:LeetCode实战 -- Task16. 无重复字符的最长子串

    背景 本篇图文是LSGO软件技术团队组织的 第二期基础算法(Leetcode)刻意练习训练营 的打卡任务.本期训练营采用分类别练习的模式,即选择了五个知识点(数组.链表.字符串.树.贪心算法),每个知 ...

  7. 【每日一算法】无重复字符的最长子串

    微信改版,加星标不迷路! 每日一算法 - 无重复字符的最长子串 思路答案 首先定义一个指针p指向该字符串的链头,然后通过p指针后的第i个字符是否和p指针后的第j个字符相同来取得最大长度.(也叫做完全遍 ...

  8. 汇编语言求无符号数组中出现的次数最多数_【今日最佳leecode通俗易懂】无重复字符的最长子串...

    相信看了这个标题的同学,对这道题以已经非常不陌生了,就是leecode当中的第三题,之所以要单独的写一写主要对我来说,里面涉及到有一个滑动窗口, 散列表, 字符编码等知识点比较重要,也有几个小技巧,这 ...

  9. 大二菜鸟———无重复字符的最长子串

    这是一枚大二菜鸟的成长反思博客   终于忍不住,在这六月将之的一天开始写起了博客.数据结构计算机算法杂七杂八学了一堆但是都只是浅尝,觉得还是要写博客反刍学习到的知识.   感谢大佬 @Java3y 的 ...

最新文章

  1. 用户从服务器上获取信息资源,从服务器端获取资源动态加载到场景.docx
  2. 密码登录错误怎么退出c语言,使用C语言判断密码是否正确,三次失败就退出,超详细教程!!...
  3. 在centos7中静默安装oracle11g
  4. 如何卸载自己手机上的APK文件程序
  5. Webpack实战(七):简单搞懂PostCSS的用法及与一些插件的用法
  6. python ---ConfigParser
  7. GL中如何让画的点为圆形
  8. CVPR2013感兴趣的文章整理
  9. python爬虫 同花顺_python 爬虫--同花顺-使用代理
  10. 计算机仿真软件的论文,【计算机仿真论文】计算机仿真软件模拟物流系统研究(共5366字)...
  11. 高等代数——大学高等代数课程创新教材(丘维声)——3.8笔记+习题
  12. PS修改图片尺寸和大小
  13. 我为什么不看好微信小程序_0
  14. NO 00004 iOS实现打砖块游戏 一 素材的制作
  15. axios的一封装和二次封装
  16. Illegal mix of collations (utf8mb4_unicode_ci,IMPLICIT) and (utf8mb4_general_ci,IMPLICIT) for operat
  17. 消防应急照明和疏散指示系统在城市隧道中的应用
  18. 免费自媒体全网平台爆文采集器
  19. Graylog之Grok解析
  20. 剑指Offer——如何做好自我介绍

热门文章

  1. 用git进行项目搭建
  2. 一些windows下调试网络的命令行
  3. MVC4做网站六后台管理:6.2网站信息设置
  4. Win7备份的取消与磁盘空间恢复
  5. 五种计算机编程语言注定要衰落,牛逼的你怎么看呢???
  6. STL sort()函数详解
  7. c语言通讯录写入文件,学C三个月了,学了文件,用C语言写了个通讯录程序
  8. 微型计算机原理应用总结,微机原理总结
  9. java facade dao_java – 在Facade模式中放置用于创建namedQuer...
  10. hive 字段不包含某个字符_hive之面试必问 hive调优