给定一个字符串s,请你找出其中不含有重复字符的最长 子串的长度。
示例 1:输入: s = "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。注意 "bca" 和 "cab" 也是正确答案。
示例 2:输入: s = "bbbbb" 输出: 1 解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:输入: s = "pwwkew" 输出: 3 解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。 请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
1、检查参数的合法性。
2、定义一个哈希表hash,用于筛选重复的字符串。
3、使用双指针,left和right,分别指向数组的开头,定义一个最大长度len_max=0。
4、开始循环右指针往前走,每遇到一个元素查询一下hash中是否有重复的元素,假如没有就往hash中插入一个元素,key为数组的值,value为元素的下标。
5、假如查询到hash中已经有对应的元素了,那找到那个元素和位置pos。记录此时hash的长度和len_max比较谁更大,用len_max记录下来。
6、在hash表中从左指针到pos的位置的元素删除(或者使用墓碑标记),修改该key值的value=pos,左指针指向pos的位置,右指针继续向前right++,直到右指针指向数组的末尾。
7、返回len_max。
class Solution { public: int lengthOfLongestSubstring(string s) { int n=s.size(); if(n<2) return n; unordered_map<char,int> hash; int len=0,max_len=1,left=0,right=1; hash[s[0]]=0; while(right<n){ auto it=hash.find(s[right]); if(it==hash.end()||it->second==-1){ len=right-left+1; max_len=max_len>len?max_len:len; hash[s[right]]=right; right++; continue; } int endPos=it->second+1; for(int i=left;i<endPos;i++){ hash[s[i]]=-1; } hash[s[right]]=right; left=endPos; right++; } return max_len; } };推荐一个零声教育学习教程,个人觉得老师讲得不错,分享给大家:[Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK等技术内容,点击立即学习:链接