LeetCode Medium|【3. 无重复字符的最长子串】
创始人
2024-11-11 21:34:30
0

力扣题目链接
状态:在本题中,我们可以很明显得看出出现了关键字:子串、最长,所以我们肯定是选用滑动窗口来解决这个题目。
滑动窗口首先要解决的就是我们选择什么样的容器来存储数据呢?本体中是计算重复字符,我们可以使用 set、map、数组均可以解决,这里分别给出三种方法。

set

这个非常直观,和我们做的一些滑动窗口的基础题是一样的

class Solution { public:     int lengthOfLongestSubstring(string s) {         std::unordered_set set;         int left = 0, right = 0;         int ans = 0;          while (right < s.length()) {             char rChar = s[right];             while (set.find(rChar) != set.end()) {                 set.erase(s[left]);                 left++;             }             set.insert(rChar);             ans = max(ans, right - left + 1);             right++;         }          return ans;     } }; 

map

对于 map ,我们最需要搞清楚的就是 key 和 value ,这里我们的 key 肯定是字符,然后 value 肯定是对应的下标,因为我们的 map 只能去搜索 key。

这样的话我们就不需要内层循环了,可以直接更新 left 。如何更新呢?当然就是把重复字符排除在外,但是为了防止 left 的回退,所以我们有:

left = max(left, map[rChar] + 1); 

这样的代码。

class Solution { public:     int lengthOfLongestSubstring(string s) {         std::unordered_map map;         int left = 0, right = 0;         int ans = 0;          while (right < s.length()) {             char rChar = s[right];             if (map.find(rChar) != map.end()) {                 left = max(left, map[rChar] + 1);             }             map[rChar] = right;             ans = max(ans, right - left + 1);             right++;         }          return ans;     } }; 

数组

对于数组,解法和 map 其实非常类似。
我们第一反应肯定就是 26 个英文字母,但是由于我们题目中要求了 「s由英文、数字、符号和空格组成」,所以很自然的想法就是 255 来表示 ASCII 码。

同样的,我们在数组中存储的是对应的下标位置。

class Solution { public:     int lengthOfLongestSubstring(string s) {         vector index(256, -1);         int left = 0, right = 0;         int ans = 0;          while (right < s.length()) {             char rChar = s[right];             if (index[rChar] != -1 && index[rChar] >= left) {                 left = max(left, index[rChar] + 1);             }             index[rChar] = right; //还是隐式类型转换             ans = max(ans, right - left + 1);             right++;         }          return ans;     } }; 

相关内容

热门资讯

来一盘!边锋有后台操控吗,鸿运... 来一盘!边锋有后台操控吗,鸿运大厅辅助原来真的有挂,靠谱教程(有挂教程)1、边锋有后台操控吗系统规律...
黑科技辅助挂!白金岛放炮罚有挂... 黑科技辅助挂!白金岛放炮罚有挂吗,云南老友竞技麻将有挂吗,广东雀神小程序机制;1)白金岛放炮罚有挂吗...
盘点几款!科乐天天踢辅助器可靠... 盘点几款!科乐天天踢辅助器可靠吗(辅助挂)外挂辅助挂(2020已更新)(百度贴吧)1、进入到科乐天天...
教程辅助!旺旺福建麻将是不是输... 教程辅助!旺旺福建麻将是不是输赢有规律,雀神小程序辅助购买是真是假,科技教程(有挂工具)小薇(透视辅...
一分钟了解!!财神十三张有人开... 一分钟了解!!财神十三张有人开挂吗,决战果真真的有挂,透明挂教程(有挂揭秘)1、财神十三张有人开挂吗...
黑科技辅助挂!江苏乐趣麻将有挂... 黑科技辅助挂!江苏乐趣麻将有挂吗,朋朋棋牌app有挂吗,雀神小程序辅助app苹果1、下载好江苏乐趣麻...
一分钟教会你!钱塘十三水辅助器... 一分钟教会你!钱塘十三水辅助器下载(透视)透视辅助软件(2025已更新)(小红书)1、钱塘十三水辅助...
玩家必看科普!决战十三水万能辅... 玩家必看科普!决战十三水万能辅助器,红河全民雀神怎么开,揭秘教程(有挂工具)1、该软件可以轻松地帮助...
一分钟秒懂!数独辅助app,大... 一分钟秒懂!数独辅助app,大同麻将亲友圈就是真的有挂,力荐教程(有挂技巧)暗藏猫腻,小编详细说明数...
黑科技辅助挂!哈灵麻将系统规律... 黑科技辅助挂!哈灵麻将系统规律,八闽十三水辅助,广东雀神小程序老是输1、全新机制【哈灵麻将系统规律软...