声明:本文原题主要来自力扣,记录此博客主要是为自己学习总结,不做任何商业等活动!

一、原题描述

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

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

示例 1:

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

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

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

提示:

s.length <= 40000

二、解题思路

2.1题目分析

拿到题目第一想法是滑动窗口,用左left右right指针只差表示不重复子字符串长度,然后右指针依次右移动,假如入到重复字符,则更新左指针到不重复的字符串位置。比如abba,此时ab为不重复,当右指针移到abb时有重复字符,此时需要更新左指针到不重复的字符位置,也即abb的最后一个b的位置,此时左右指针指向同一个值。如何更新左指针到最近重复字符位置呢,此时需要用一个哈希表记录每个字符和对应字符的下标,并且遇到重复字符则更新为最近位置。

关键代码如下:

a1.顺序遍历字符串

a2.用一个哈希表记录不重复字符和对应下标 hashTable[i] = i;

a3.假如重复,则更新该字符下标为最新位置 left == max(left, hashTable[i] + 1)

a4.最大不重复子字符串长度为ans == max(ans, right - left + 1)

for (int l = 0, r = 0; r < size; ++r) // 遍历一遍字符串
{auto iter = hashTable.find(s[r]); // 查找字符串if (iter != hashTable.end()) // 找到重复字符则更新左指针位置{l = std::max(iter->second + 1, l); // 取左指针最大值位置,即左指针只能前进不能后退,例如abba}hashTable[s[r]] = r; // 更新重复字符最新位置,无重复字符则增加新字符ans = std::max(ans, r - l + 1);
}

2.2完整代码

class Solution {
public:
/*
思路:abcabbaa,双指针,快指针依次遍历数组,快指针-慢指针==不重复长度
当遇到重复字符更新慢指针到该字符最近记录位置+1,并跟原值取最大值,用哈希表记录每个不重复字符最近位置
*/   int lengthOfLongestSubstring(string s) {std::unordered_map<char,int> hashTable; // 哈希表存储不重复字符和该字符对应下标int ans=0, size = s.size();for(int l=0,r=0; r<size; ++r) // 遍历一遍字符串{auto iter = hashTable.find(s[r]); // 查找字符串if(iter != hashTable.end()) // 找到重复字符则更新左指针位置{l = std::max(iter->second+1, l); // 取左指针最大值位置,即左指针只能前进不能后退,例如abba}hashTable[s[r]] = r; // 更新重复字符最新位置,无重复字符则增加新字符ans = std::max(ans, r-l+1);}return ans;}
};

输出结果

求最长不含重复字符的子字符串——C++相关推荐

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

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

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

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

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

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

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

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

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

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

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

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

  7. 剑指offer48-最长不含重复字符的子字符串(双指针经典)

    问题描述 请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度. 示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 ...

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

    请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度. 示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 " ...

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

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

最新文章

  1. 【pandas学习笔记】Series
  2. Java中取两位小数
  3. The source attachment does not contain the source for the file Activity.class
  4. WIF(Windows Identity Foundation) 被动联合身份验证过程详解
  5. 9.28PMP每日一题
  6. android 机顶盒 view 焦点,AndroidTV/机顶盒 ListView获取焦点与点击事件问题处理方案...
  7. java 使用apollo,Springboot apollo原理及使用方法详解
  8. python中split的用法-python中的split()函数的用法
  9. 调研分析-全球与中国非线性光学BIBO晶体(BiB3O6)市场现状及未来发展趋势
  10. 山东理工oj答案java_山东理工大学ACM程序设计竞赛-山东理工ACM主页.DOC
  11. 更新appid失败,登录用户不是该小程序的开发者
  12. 5分钟搞定内网穿透工具-ngrok
  13. 掌握.NET中的日常打印
  14. C#界面程序设计——04导入并修改word文件
  15. Android之动画(一)
  16. 洛谷P5238 整数校验器
  17. Java工作4年从美团、百度、阿里、京东面试回来感想
  18. 设计文档的内容(概要设计,需求分析,详细设计)
  19. 十大黑客常用Linux系统
  20. 增值电信业务中1069短信代码和1066短信代码有什么区别吗?

热门文章

  1. 2019加密市场金融借贷领域研究报告(英文版) | TokenInsight
  2. android wear 神奇宝贝,宝可梦Home安卓版下载_宝可梦Home手机app官方版(Pokemon Home) v1.0.3-安族游戏网...
  3. 入职脉脉是一种什么体验?附上我的脉脉Java后端开发面经,本人已于上周成功入职!
  4. 再谈 共轭方向法/Conjugate Direction Method In Optimization
  5. android 该文件包与具有同一名称的现有文件包存在冲突
  6. 参考文献格式详细解释和引用(常见)
  7. 腾讯云服务器计费模式包年包月/按量计费/竞价实例选择困难户
  8. 故障转移集群搭建高可用文件共享服务器
  9. Tensorflow 2.* 网络训练(二) fit(x, y, batch_size, epochs, verbose, validation_split, initial_epoch... )
  10. 技术团队如何做技术规划?