当前位置:   article > 正文

(每日一练C++)3. 无重复字符的最长子串_c++ 计算字符串最大不重复的长度

c++ 计算字符串最大不重复的长度

给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。

示例 1:

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

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

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

  1. class Solution {
  2. public:
  3. int lengthOfLongestSubstring(string s) {
  4. // 哈希集合,记录每个字符是否出现过
  5. unordered_set<char> occ;
  6. int n = s.size();
  7. // 右指针,初始值为 -1,相当于我们在字符串的左边界的左侧,还没有开始移动
  8. int rk = -1, ans = 0;
  9. // 枚举左指针的位置,初始值隐性地表示为 -1
  10. for (int i = 0; i < n; ++i) {
  11. if (i != 0) {
  12. // 左指针向右移动一格,移除一个字符
  13. occ.erase(s[i - 1]);
  14. }
  15. while (rk + 1 < n && !occ.count(s[rk + 1])) {
  16. // 不断地移动右指针
  17. occ.insert(s[rk + 1]);
  18. ++rk;
  19. }
  20. // 第 i 到 rk 个字符是一个极长的无重复字符子串
  21. ans = max(ans, rk - i + 1);
  22. }
  23. return ans;
  24. }
  25. };
  26. 作者:LeetCode-Solution
  27. 链接:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/solution/wu-zhong-fu-zi-fu-de-zui-chang-zi-chuan-by-leetc-2/
  28. 来源:力扣(LeetCode)
  29. 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/221973
推荐阅读
相关标签
  

闽ICP备14008679号