原题链接:https://leetcode.cn/problems/longest-substring-without-repeating-characters/
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
示例一
输入: s = “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
示例二
输入: s = “bbbbb”
输出: 1
解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。
示例三
输入: s = “pwwkew”
输出: 3
解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。
请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。
分析图中过程:
敲代码
class Solution { public: int lengthOfLongestSubstring(string s) { int start(0), end(0), result(0); for (int index = 0; index < s.size(); index++) { end = index; for (int i = start; i < end; i++) { if (s[i] == s[end]) { start = i + 1; //及时跳出 break; } } result = max(result, end - start + 1); } return result; } };
运行结果
执行用时: 8 ms
内存消耗: 6.7 MB
思路与滑动窗口相同,不同的是查找重复元素的方式
需要注意的是:
代码
class Solution { public: int lengthOfLongestSubstring(string s) { int start(0), end(0), result(0); unordered_mapmp; for (int i = 0; i < s.size(); i++) { end = i; if (mp.find(s[i]) != mp.end() && mp[s[i]] >= start) { start = mp[s[i]] + 1; } mp[s[i]] = end; result = max(result, end - start + 1); } return result; } };
运行结果
执行用时: 20 ms
内存消耗: 8.1 MB
判断是否出现过时,利用vector容器代替哈希表以优化时间
思路与前两种方法相同,不同的仍是检验重复的方法
代码
class Solution { public: int lengthOfLongestSubstring(string s) { int start(0), end(0), result(0); vectorv(128, -1); for (int i = 0; i < s.size(); i++) { end = i; if (v[int(s[i])] >= start) { start = v[int(s[i])] + 1; } v[int(s[i])] = end; result = max(result, end - start + 1); } return result; } };
运行结果
执行用时:8 ms, 在所有 C++ 提交中击败了88.74%的用户
内存消耗:7.4 MB, 在所有 C++ 提交中击败了79.74%的用户
力扣给这道题的分类是中等,对新手来说很难,而且还用到了两个指针,虽然上面的代码中用的是下标访问的方式,不是严格的指针,但也不容易,建议就是多看看题解,多写几遍代码,对于容器和重载的一些方法,可以随时去cplusplus网站查阅,边刷题边巩固
我的博客即将同步至腾讯云开发者社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=26uneso59lnoo
Copyright © 2023 leiyu.cn. All Rights Reserved. 磊宇云计算 版权所有 许可证编号:B1-20233142/B2-20230630 山东磊宇云计算有限公司 鲁ICP备2020045424号
磊宇云计算致力于以最 “绿色节能” 的方式,让每一位上云的客户成为全球绿色节能和降低碳排放的贡献者