求无重复字符的最长子串

简介: 求无重复字符的最长子串

题目描述:

输入: s = "pwwkew"

输出: 3

解释: 因为无重复字符的最长子串是 "wke"

,所以其长度为 3。

    请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。

数据范围 :

  • 0 <= s.length <= 5 * 104

思路:根据这个题的数据范围,不可能做到O(n^2),所以考虑遍历一次或者里面加一个二分。 遍历的话那么容易想到双指针来做,用i和j来维护一个区间,这个区间的所有元素都只出现过一次。

     遍历到i的时候,如果此时j--i有相同的字符,也就是s[i]==s[j]的时候,以i结尾的子串符合条件的最大长度是多大呢?答案的左区间一定在j的右边,为什么?因为如果最后的答案的区间的左边界在j的左边,那么还是没有改变在目前维护区间存在s[i]==s[j]的事实。

     也就是说,如果遇到s[i]==s[j],我们只需要j++,也就是缩小左边界,直到mp[i]==1.再更新一次答案,目前维护的区间的长度为i-j+1,与上一个答案求最大值就行了。 为什么答案一定正确?因为遍历了每一个s[i]作为答案的右区间的可能。

代码:

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        map<char,int> mp;//哈希每个元素出现的次数
        int ans=0;
        for(int i=0,j=0;i<s.size();i++){
            mp[s[i]]++;
            while(mp[s[i]]>1&&j<=i){
               // cout<<j<<" "<<i<<endl;
                mp[s[j]]--;
               j++;
            }
            
            ans=max(ans,i-j+1);//更新答案
        }
        return ans;
    }
};


相关文章
|
索引
LeetCode3-无重复字符的最长子串
LeetCode3-无重复字符的最长子串
|
1月前
|
存储 算法
Leetcode第三题(无重复字符的最长子串)
这篇文章介绍了解决LeetCode第三题“无重复字符的最长子串”的算法,使用滑动窗口技术来找出给定字符串中最长的不含重复字符的子串,并提供了详细的代码实现和解释。
66 0
Leetcode第三题(无重复字符的最长子串)
|
3月前
|
Java
输入一个字符串,找出其中不含有重复字符的最长子串的长度。
这篇文章提供了一个Java解决方案,用于找出输入字符串中不含有重复字符的最长子串的长度,通过使用HashSet来跟踪字符并计算最长不重复字符子串。
输入一个字符串,找出其中不含有重复字符的最长子串的长度。
|
3月前
|
算法
LeetCode第3题无重复字符的最长子串
该文章介绍了 LeetCode 第 3 题无重复字符的最长子串的解法,通过使用 HashSet 记录不重复的子元素,以每个字符开头遍历字符串,遇到重复字符则重新计算,最终找到最长子串,同时提到可以考虑使用 HashMap 降低复杂度。
LeetCode第3题无重复字符的最长子串
|
5月前
3. 无重复字符的最长子串
3. 无重复字符的最长子串
|
5月前
|
存储 算法 数据挖掘
LeetCode 第三题:无重复字符的最长子串 详解 【3/1000】
LeetCode 第三题:无重复字符的最长子串 详解 【3/1000】
|
6月前
|
存储 算法 Go
LeetCode 第三题: 无重复字符的最长子串
  给定一个字符串,请你找出其中不含有重复字符的最长子串的长度。
|
6月前
leetcode-3:无重复字符的最长子串
leetcode-3:无重复字符的最长子串
36 0
|
6月前
leetcode:3. 无重复字符的最长子串
leetcode:3. 无重复字符的最长子串
35 0
无重复字符的最长子串
写一个if语句,当left小于right的时候,就写一个循环遍历从left下标开始的元素到right下标前面的元素,判断是否与right下标的元素相同,相同的话就跳出循环,令left 等于 与 right下标元素相同的元素后面的元素.怎么判断在left和right之间是否存在又和right相同的元素呢?这就用到了falg.如果left < right 的时候就让 right++; max = max = right - left + 1。
54 0