LeetCode 003. 无重复字符的最长子串 双指针
Posted itdef
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 003. 无重复字符的最长子串 双指针相关的知识,希望对你有一定的参考价值。
地址 https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/
题目描述
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
样例
示例 1:
输入: "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
算法1
1 暴力遍历
2 双指针 依次遍历。 每次移动只需要计算移出的一个和进入的一个元素
3 todo 哈希记录字母出现最右索引 使用变量记录字符串的最左索引
class Solution { public: int lengthOfLongestSubstring(string s) { int ret = 0; do { if (s.size() <= 1) { ret = s.size(); break; } map<char, int> mapChars; for (int i = 0; i < s.size(); i++) { for (int j = i; j < s.size(); j++) { if (mapChars[s[j]] != 0) { break; } else { mapChars[s[j]]++; } } if (mapChars.size() > ret) { ret = mapChars.size(); } mapChars.clear(); } } while (false); std::cout << ret << " "; return ret; } }; 作者:defddr 链接:https://www.acwing.com/solution/LeetCode/content/3626/ 来源:AcWing 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
class Solution { public: int leHash[256] = { 0 }; int lengthOfLongestSubstring(string s) { int l = 0; int r = 0; int maxLen = 0; while (r < s.size()) { int lidx = s[l] ; int ridx = s[r] ; if (leHash[ridx] == 0) { leHash[ridx]++; if (maxLen < (r - l + 1)) maxLen = r - l + 1; r++; } else { while (leHash[ridx] != 0 && l <s.size()) { leHash[lidx]--; l++; lidx = s[l] ; } leHash[ridx]++; if (maxLen < (r - l + 1)) maxLen = r - l + 1; r++; } } return maxLen; } }; 作者:defddr 链接:https://www.acwing.com/solution/LeetCode/content/3626/ 来源:AcWing 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
以上是关于LeetCode 003. 无重复字符的最长子串 双指针的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode--003--无重复字符的最长子串(java)
leetcode-003无重复字符的最长子串--python
leetcode-003无重复字符的最长子串--python