LeetCode 热题100——3.无重复字符的最长子串
题目给定一个字符串 s 请你找出其中不含有重复字符的 最长 子串 的长度。示例 1:输入: s abcabcbb 输出: 3 解释: 因为无重复字符的最长子串是 abc所以其长度为 3。注意 bca 和 cab 也是正确答案。示例 2:输入: s bbbbb 输出: 1 解释: 因为无重复字符的最长子串是 b所以其长度为 1。示例 3:输入: s pwwkew 输出: 3 解释: 因为无重复字符的最长子串是 wke所以其长度为 3。请注意你的答案必须是 子串 的长度pwke 是一个子序列不是子串。提示0 s.length 5 * 10^4s 由英文字母、数字、符号和空格组成答案class Solution { public: int lengthOfLongestSubstring(string s) { if(s.size()0) return 0; unordered_setchar hash; int maxlen0; int left0;//窗口左边界 for(int right0;rights.size();right){ // 如果当前字符已存在于窗口中则不断缩小左边界直到当前字符被移除 while(hash.count(s[right])){ hash.erase(s[left]);//移除 left; } maxlenmax(maxlen,right-left1); //将当前字符加入窗口中 hash.insert(s[right]); } return maxlen; } };举例演示s abcabcbbleft 0maxlen 0hash 为空循环遍历 right 从 0 到 71.right 0字符 ahash.count(a) 0 → 不进入 while窗口长度 right - left 1 0 - 0 1 1更新 maxlen max(0,1) 1插入 a → hash {a}2.right 1字符 bhash.count(b) 0 → 不进入 while窗口长度 1 - 0 1 2maxlen max(1,2) 2插入 b → hash {a,b}3.right 2字符 chash.count(c) 0 → 不进入 while窗口长度 2 - 0 1 3maxlen max(2,3) 3插入 c → hash {a,b,c}4.right 3字符 ahash.count(a) 1 → 进入 while删除 s[left]即 s[0] ahash 变为 {b,c}left → left 1再次检查 hash.count(a)现在 hash 为 {b,c}count(a) 0退出 while窗口长度 3 - 1 1 3maxlen 仍为 3插入 a → hash {b,c,a}5.right 4字符 bhash.count(b) 1 → 进入 while删除 s[left]即 s[1] bhash 变为 {c,a}left → left 2再次检查 hash.count(b)hash 为 {c,a}count(b) 0退出窗口长度 4 - 2 1 3maxlen 仍为 3插入 b → hash {c,a,b}6.right 5字符 chash.count(c) 1 → 进入 while删除 s[left]即 s[2] chash 变为 {a,b}left → left 3再次检查 hash.count(c)hash 为 {a,b}count(c) 0退出窗口长度 5 - 3 1 3maxlen 仍为 3插入 c → hash {a,b,c}7.right 6字符 bhash.count(b) 1 → 进入 while删除 s[left]即 s[3] ahash 变为 {b,c}left → left 4再次检查 hash.count(b)现在 hash 为 {b,c}count(b) 1继续 while删除 s[left]即 s[4] bhash 变为 {c}left → left 5再次检查 hash.count(b)hash 为 {c}count(b) 0退出窗口长度 6 - 5 1 2maxlen 仍为 3插入 b → hash {c,b}8.right 7字符 bhash.count(b) 1 → 进入 while删除 s[left]即 s[5] chash 变为 {b}left → left 6再次检查 hash.count(b)hash 为 {b}count(b) 1继续 while删除 s[left]即 s[6] bhash 变为 {}left → left 7再次检查 hash.count(b)hash 为空count(b) 0退出窗口长度 7 - 7 1 1maxlen 仍为 3插入 b → hash {b}循环结束返回 maxlen 3时间复杂度时间复杂度O(n)其中 n 是字符串长度。每个字符最多被左右指针各访问一次因此总操作次数为 O(2n) ≈ O(n)。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2473870.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!