LetCode 3 无重复字符的最大子串
提示
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 无重复字符的最大子串相关推荐
- LeetCode / Scala - 无重复字符最长子串 ,最长回文子串
一.引言 LeetCode 里有一类字符子串问题,这里主要分析无重复字符的最长子串与最长回文子串,总结相关方法. 二.无重复字符最长子串 1.题目要求 给定字符串 s,要求找出字符内无重复的最长子串, ...
- leetcode3 无重复字符最长子串
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc&q ...
- Leecode刷题热题HOT100(3)——无重复字符最长子串
- leetcode刷题:无重复字符的最长子串
题目: 分析: 取巧解法,通过set class Solution { public:int lengthOfLongestSubstring(string s) {if(s.size() == 0) ...
- 【leetcode】力扣刷题(3):无重复字符的最长子串(go语言)
一.问题描述 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 " ...
- 刻意练习:LeetCode实战 -- Task16. 无重复字符的最长子串
背景 本篇图文是LSGO软件技术团队组织的 第二期基础算法(Leetcode)刻意练习训练营 的打卡任务.本期训练营采用分类别练习的模式,即选择了五个知识点(数组.链表.字符串.树.贪心算法),每个知 ...
- 【每日一算法】无重复字符的最长子串
微信改版,加星标不迷路! 每日一算法 - 无重复字符的最长子串 思路答案 首先定义一个指针p指向该字符串的链头,然后通过p指针后的第i个字符是否和p指针后的第j个字符相同来取得最大长度.(也叫做完全遍 ...
- 汇编语言求无符号数组中出现的次数最多数_【今日最佳leecode通俗易懂】无重复字符的最长子串...
相信看了这个标题的同学,对这道题以已经非常不陌生了,就是leecode当中的第三题,之所以要单独的写一写主要对我来说,里面涉及到有一个滑动窗口, 散列表, 字符编码等知识点比较重要,也有几个小技巧,这 ...
- 大二菜鸟———无重复字符的最长子串
这是一枚大二菜鸟的成长反思博客 终于忍不住,在这六月将之的一天开始写起了博客.数据结构计算机算法杂七杂八学了一堆但是都只是浅尝,觉得还是要写博客反刍学习到的知识. 感谢大佬 @Java3y 的 ...
最新文章
- 用户从服务器上获取信息资源,从服务器端获取资源动态加载到场景.docx
- 密码登录错误怎么退出c语言,使用C语言判断密码是否正确,三次失败就退出,超详细教程!!...
- 在centos7中静默安装oracle11g
- 如何卸载自己手机上的APK文件程序
- Webpack实战(七):简单搞懂PostCSS的用法及与一些插件的用法
- python ---ConfigParser
- GL中如何让画的点为圆形
- CVPR2013感兴趣的文章整理
- python爬虫 同花顺_python 爬虫--同花顺-使用代理
- 计算机仿真软件的论文,【计算机仿真论文】计算机仿真软件模拟物流系统研究(共5366字)...
- 高等代数——大学高等代数课程创新教材(丘维声)——3.8笔记+习题
- PS修改图片尺寸和大小
- 我为什么不看好微信小程序_0
- NO 00004 iOS实现打砖块游戏 一 素材的制作
- axios的一封装和二次封装
- Illegal mix of collations (utf8mb4_unicode_ci,IMPLICIT) and (utf8mb4_general_ci,IMPLICIT) for operat
- 消防应急照明和疏散指示系统在城市隧道中的应用
- 免费自媒体全网平台爆文采集器
- Graylog之Grok解析
- 剑指Offer——如何做好自我介绍
热门文章
- 用git进行项目搭建
- 一些windows下调试网络的命令行
- MVC4做网站六后台管理:6.2网站信息设置
- Win7备份的取消与磁盘空间恢复
- 五种计算机编程语言注定要衰落,牛逼的你怎么看呢???
- STL sort()函数详解
- c语言通讯录写入文件,学C三个月了,学了文件,用C语言写了个通讯录程序
- 微型计算机原理应用总结,微机原理总结
- java facade dao_java – 在Facade模式中放置用于创建namedQuer...
- hive 字段不包含某个字符_hive之面试必问 hive调优