题目地址:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/
题目描述
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
题目示例
示例 1:
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
示例 4:
输入: s = ""
输出: 0
解题思路
思路:滑动窗口+双指针。使用双指针i和j分别表示无重复子串的左右边界,滑动窗口的右边界不断将新元素加入窗口,当窗口内的元素不含有重复元素市,满足要求,否则不满足要求。此时,需要将滑动窗口的左边界i右移,移至重复元素的下一位置,并重新开始移动窗口的右边界j,一直维持这样的滑动窗口,记录窗口的最大长度。
程序源码
class Solution { public: int lengthOfLongestSubstring(string s) { if(s.empty()) return 0; int len = 0; unordered_map<char, int> dic; //存储最长子串 int i = 0, j = 0; //i,j分别为不重复字符最长子串左右边界[i,j] while(j < s.size()) { if(dic.find(s[j]) != dic.end()) //用m.count(s[j])>0也可判断是否已经存在该元素 { i = max(i, dic[s[j]] + 1); //更新左边界为重复字符下一位置 } dic[s[j]] = j; len = max(len, j - i + 1); j++; //当前窗口无重复元素,右边界j一直右移 } return len; } };
class Solution { public: int lengthOfLongestSubstring(string s) { unordered_set<char> visited; int len = 0; for (int left = 0, right = 0; right < s.size(); right++) { while (visited.count(s[right]) > 0) { visited.erase(s[left]); left++; } visited.insert(s[right]); len = max(len, right - left + 1); } return len; } };
参考文章:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/solution/shuang-zhi-zhen-hua-dong-chuang-kou-dong-tai-gui-2/