最长不重复子串

  • 题目
  • 分析
  • 代码
  • 代码运行过程
  • 个人总结

题目

给定一个字符串,找出不含有重复字符的最长子串的长度。
示例 1:

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

示例 2:

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

示例 3:

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

分析

这道求让我们求最长的无重复字符的子串,注意这里是子串,不是子序列,所以必须是连续的。我们先不考虑代码怎么实现,如果给一个例子中的例子"abcabcbb",让你手动找无重复字符的子串,该怎么找。
博主会一个字符一个字符的遍历,比如a,b,c,然后又出现了一个a,那么此时就应该去掉第一次出现的a,然后继续往后,又出现了一个b,则应该去掉一次出现的b,以此类推,最终发现最长的长度为3。所以说,我们需要记录之前出现过的字符,记录的方式有很多,最常见的是统计字符出现的个数,但是这道题字符出现的位置很重要,所以我们可以使用HashMap来建立字符和其出现位置之间的映射。进一步考虑,由于字符会重复出现,到底是保存所有出现的位置呢,还是只记录一个位置?我们之前手动推导的方法实际上是维护了一个滑动窗口,窗口内的都是没有重复的字符,我们需要尽可能的扩大窗口的大小。由于窗口在不停向右滑动,所以我们只关心每个字符最后出现的位置,并建立映射。窗口的右边界就是当前遍历到的字符的位置,为了求出窗口的大小,我们需要一个变量left来指向滑动窗口的左边界,这样,如果当前遍历到的字符从未出现过,那么直接扩大右边界,如果之前出现过,那么就分两种情况,在或不在滑动窗口内,如果不在滑动窗口内,那么就没事,当前字符可以加进来,如果在的话,就需要先在滑动窗口内去掉这个已经出现过的字符了,去掉的方法并不需要将左边界left一位一位向右遍历查找,由于我们的HashMap已经保存了该重复字符最后出现的位置,所以直接移动left指针就可以了。我们维护一个结果res,每次用出现过的窗口大小来更新结果res,就可以得到最终结果啦。

这里我们可以建立一个256位大小的整型数组来代替HashMap,这样做的原因是ASCII表共能表示256个字符,所以可以记录所有字符,然后我们需要定义两个变量res和left,其中res用来记录最长无重复子串的长度,left指向该无重复子串左边的起始位置,然后我们遍历整个字符串,对于每一个遍历到的字符,如果哈希表中该字符串对应的值为0,说明没有遇到过该字符,则此时计算最长无重复子串,i - left +1,其中i是最长无重复子串最右边的位置,left是最左边的位置,还有一种情况也需要计算最长无重复子串,就是当哈希表中的值小于left,这是由于此时出现过重复的字符,left的位置更新了,如果又遇到了新的字符,就要重新计算最长无重复子串。最后每次都要在哈希表中将当前字符对应的值赋值为i+1。

代码

class Solution {public:int lengthOfLongestSubstring(string s) {int m[256] = {0}, res = 0, left = 0;for (int i = 0; i < s.size(); ++i) {if (m[s[i]] == 0 || m[s[i]] < left) {res = max(res, i - left + 1);} else {left = m[s[i]];}m[s[i]] = i + 1;}return res;}
};

代码运行过程

以"abcabcab"为例:(这里以a来代替a的ascll码值)
判断:m[a]==0(a没出现过) res=1 更新m{a}=1(a出现在第1个位置)
m[b]==0 res=2 更新m[b]=2(b出现在第2个位置)
m[c]==0 res=3 更新m[c]=3 (c出现在第3个位置)
判断:此时m[a]==1!=0,所以执行else left=m[a](更新起始位置)再次更新m[a]=4
判断:此时m[b]==2!=0,所以执行else left=m[b] m[b]=5
直到最后,滑窗滑到"cab"

个人总结

m[s[i]]中的索引是以s[i]的字符ASCII,其值为该字符在s中最后出现的位置
相当于HashMap中的key=字符,value=位置

if (m[s[i]] == 0 || m[s[i]] < left)

这个判断可以理解为如果 第i个字符从未出现过,或i在之前曾经出现过,
那么我们就将当前最长长度设置为从left-1到i的长度i-left+1
重要的是我们要了解这个程序的逻辑结构———如何判别一个字符子串重复
其次,还要理解滑窗的概念,滑窗的确定需要两个值

  1. 起始位置left,即到目前为止,不重复的第一个字符
  2. 长度res,也是最后要返回的值

想了解更多算法、c++、java、android等知识,欢迎点击···
个人博客:allenmistake.github.io

Leetcode3.最长不重复子串相关推荐

  1. Leetcode3:最长不重复子串

    Leetcode3: Longest Substring Without Repeating Characters 具体题目如下: Given a string, find the length of ...

  2. 最长不重复字符串python_Python简单实现查找一个字符串中最长不重复子串的方法...

    本文实例讲述了Python简单实现查找一个字符串中最长不重复子串的方法.,具体如下: 刚结束的一个笔试题,很简单,不多说简单贴一下具体的实现: #!usr/bin/env python #encodi ...

  3. 寻找一个字符串中的最长不重复子串的长度

    2019独角兽企业重金招聘Python工程师标准>>> 算法使用两个下标来分别代表不重复子串的第一个字符的前一个字符和最后一个字符,记为i和j flag为长度,n为比较的参数 < ...

  4. [Jobdu] 题目1530:最长不重复子串

    题目描述: 最长不重复子串就是从一个字符串中找到一个连续子串,该子串中任何两个字符都不能相同,且该子串的长度是最大的. 输入: 输入包含多个测试用例,每组测试用例输入一行由小写英文字符a,b,c... ...

  5. 最长重复子串和最长不重复子串求解

    最长重复子串和最长不重复子串求解 本文内容框架: §1 最长重复子串 基本方法.KMP算法求解.后缀数组求解 §2 最长不重复子串 基本方法.动态规划.动态规划+Hash §3 小结 §1最长重复子串 ...

  6. 最长公共子序列|最长公共子串|最长重复子串|最长不重复子串|最长回文子串|最长递增子序列|最大子数组和...

    最长公共子序列|最长公共子串|最长重复子串|最长不重复子串|最长回文子串|最长递增子序列|最大子数组和 文章作者:Yx.Ac   文章来源:勇幸|Thinking (http://www.ahathi ...

  7. java 求最长重复子串_给定一个字符串,求出其最长的重复子串。

    #include #include #include #include using namespace std; //给定一个字符串,求出其最长的重复子串 //方法一 string lsubstr_1 ...

  8. LeetCode:Longest Substring Without Repeating Characters(最长不重复子串)

    题目链接 Given a string, find the length of the longest substring without repeating characters. For exam ...

  9. python查找最长的字符串_Python简单实现查找一个字符串中最长不重复子串的方法...

    本文实例讲述了Python简单实现查找一个字符串中最长不重复子串的方法.分享给大家供大家参考,具体如下: 刚结束的一个笔试题,很简单,不多说简单贴一下具体的实现: #!usr/bin/env pyth ...

最新文章

  1. 2015_8_21作业——有自翻译有复制他人的英语太差
  2. Apache端口设置多域名和转发请求(虚拟域名)
  3. RHCSA笔记整理(1)
  4. 推荐系统依据近期浏览进行推荐
  5. UE4 多个static mesh合并成一个static mesh
  6. document.getElementsByName和document.getElementById用法
  7. 亚马逊aws深度学习_AWS速查表:Amazon Web Services入门时首先要学习的5件事
  8. Prism4文档翻译(第九章 第二部分)
  9. 【我的物联网成长记17】一条物联网设备控制命令的一生
  10. 验证登录信息是否合法
  11. 使用redis分布式锁+lua脚本实现分布式定时任务控制demo
  12. Goodfellow新研究:对抗样例让机器与人类双双上当 | 论文
  13. 淘宝天猫获取商品类目信息api接口数据获取
  14. WinRAR v5.40 官网无广告弹窗正式版
  15. WPS快捷键之 通用基础
  16. 大牛教你如何利用积分商城API接口对接积分商城平台
  17. 使用aspose进行将word转换为图片格式
  18. 1设计一身高体重测量仪c语言,身高体重测量仪使用经验
  19. 如何使用CentOS linux来搭建u-email邮件服务器(AIIP全国技能大赛企业联合教程)
  20. QQ批量挂机(python实现)

热门文章

  1. Flutter 学习 之 图片的选择、裁切、保存
  2. ChatGPT的焦虑蔓延,暴露了企业转型的关键要素
  3. java计算机毕业设计流浪动物收容与领养源码+系统+数据库+lw文档+mybatis+运行部署
  4. wow龙之召唤服务器状态,魔兽世界怀旧服龙之召唤服务器阵营比例 魔兽世界怀旧服龙之召唤服务器人口普查...
  5. COLORREF结构
  6. 美国人的10个文化偶像(2005 评出)
  7. 录制游戏视频——fraps
  8. java 入门 博客园_java入门基础
  9. 地区做社区团购都是怎么做和怎么去转化
  10. 第三阶段学习心得总结