题目
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:输入: "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
思路
模拟查找最长子串,依次以较左边起点为开始,找子串直到遇见有重复字符,然后依次起点右移,重复步骤。
- 抽象出一个滑动窗口,子串以左边为起点,右边指针扩展至第一个不重复字符或者最后一个不重复字符,采用hash集合简化窗口内字符的查找
- 细节处理:左起点右移的元素删除,右指针的边界和元素定义(是否归属子串,决定子串长度的计算式)
解法:滑动窗口,hashset
class Solution {
public:int lengthOfLongestSubstring(string s) {int len = s.length();if (len < 2)return len;int maxLen = 0;int right = 0; //滑动窗口的右指针unordered_set<char> set;for (int i = 0; i < len; ++i) { //滑动窗口的左起点if (i != 0) //窗口右移时,删除旧起点的元素set.erase(s[i-1]);while(right < len && !set.count(s[right])) {//向右扩展窗口set.insert(s[right]);++right;}maxLen = max(right-i, maxLen); //右指针减左起点即长度,用max()}return maxLen;}
};