网络建站公司如何做市场,卓训网是个什么网站,龙华企业网站建设公司,免费新闻源发布平台3. 无重复字符的最长子串
题面#xff1a;
给定一个字符串 s #xff0c;请你找出其中不含有重复字符的 最长 子串 的长度。 【字串】#xff1a;子字符串 是字符串中连续的 非空 字符序列。
示例 1:
输入: s “abcabcbb” 输出: 3 解释: 因为无重复字符的最长子串是 “…3.无重复字符的最长子串题面给定一个字符串 s 请你找出其中不含有重复字符的 最长 子串 的长度。【字串】子字符串 是字符串中连续的 非空 字符序列。示例 1:输入: s “abcabcbb”输出: 3解释: 因为无重复字符的最长子串是 “abc”所以其长度为 3。注意 “bca” 和 “cab” 也是正确答案。示例 2:输入: s “bbbbb”输出: 1解释: 因为无重复字符的最长子串是 “b”所以其长度为 1。示例 3:输入: s “pwwkew”输出: 3解释: 因为无重复字符的最长子串是 “wke”所以其长度为 3。请注意你的答案必须是 子串 的长度“pwke” 是一个子序列不是子串。解析针对于本道题目而言Hot题单中放在了滑动窗口的位置滑动窗口一般是处理连续序列时采用的方法针对于一个大的字符串or列表而言滑动窗口相当于是在大的列表中利用left与right两个指针开辟了一个小的连续列表正是因为如此其对于连续的子序列or字串问题是一个很不错的方法两个指针指定的范围其间就是连续的我们可以保证答案满足连续的要求。话题转移到这道题目上来就是我们要找的就是一个长字符串中的一个小字符串该字符串需满足无重复的字符元素且长度最长。对于滑动窗口而言我们利用这个窗口的右边界不断地向右探索每次探索到新的字符时在哈希表中检测目前的s[left:right]中是否已经存在该字符了如若不存在那就在哈希表中加入反之我们需要更新ans此后将left向右移动同时删除前面的哈希表中的字符因为其已经被中断了直至s[right]不在现有的哈希表中。例如s “pwwkew”r i g h t 0 , s e t . i n s e r t ( ′ p ′ ) right 0,set.insert(p)right0,set.insert(′p′)r i g h t 1 , s e t . i n s e r t ( ′ w ′ ) right 1,set.insert(w)right1,set.insert(′w′)r i g h t 2 , ′ w ′ 重复 a n s r i g h t − l e f t 2 。此后我们调整 l e f t 直至删除上一次出现 的 ′ w ′ 为止 right2,w重复ansright-left 2。此后我们调整left直至删除上一次出现的w为止right2,′w′重复ansright−left2。此后我们调整left直至删除上一次出现的′w′为止删除后即为l e f t 2 , r i g h t 2 left2,right2left2,right2我们相当于又开始了一次新的字符串搜索直至r i g h t rightright遍历完整个字符串。s “djdv”r i g h t 0 , s e t . i n s e r t ( ′ d ′ ) right0,set.insert(d)right0,set.insert(′d′)r i g h t 1 , s e t . i n s e r t ( ′ j ′ ) right1,set.insert(j)right1,set.insert(′j′)r i g h t 2 , ′ d ′ 重复 a n s r i g h t − l e f t 2 。此后我们调整 l e f t 直至删除上一次出现 的 ′ d ′ 为止 right2,d重复ans right - left 2。此后我们调整left直至删除上一次出现的d为止right2,′d′重复ansright−left2。此后我们调整left直至删除上一次出现的′d′为止删除后即为l e f t 1 , r i g h t 2 left1,right2left1,right2我们相当于是回到了r i g h t rightright向右移动的一个中间步骤直至r i g h t rightright遍历完整个字符串。复杂度时间复杂度O ( n ) O(n)O(n)空间复杂度O ( m i n ( n , m ) ) m 为字符集大小 O(min(n, m))\ m为字符集大小O(min(n,m))m为字符集大小Code// C class Solution { public: int lengthOfLongestSubstring(string s) { unordered_setchar temp; int left 0; int right 0; int ans 0; int n s.size(); while (right n) { auto it temp.find(s[right]); if (it temp.end()) // 当前set中不存在该字符记录 { temp.insert(s[right]); right; ans max(ans, right - left); } else { temp.erase(s[left]); left; } } return ans; } };# PythonclassSolution:deflengthOfLongestSubstring(self,s:str)-int:tempset()nlen(s)left,right,ans0,0,0whilerightn:ifs[right]notintemp:temp.add(s[right])right1ansmax(ans,right-left)else:temp.remove(s[left])left1returnans// Rust// use std::cmp;usestd::collections::HashSet;implSolution{pubfnlength_of_longest_substring(s:String)-i32{letmuttempHashSet::new();letmutleft0;letmutright0;letmutans0;letns.len();// Rust无法直接通过索引访问字符需要转化为Veccharletchars:Vecchars.chars().collect();whilerightn{if!temp.contains(chars[right]){temp.insert(chars[right]);right1;// ans cmp::max(ans, right - left);ansans.max(right-left);}else{temp.remove(chars[left]);left1;}}ansasi32}}