[LeetCode] 159. Longest Substring with At Most Two Distinct Characters 最多有两个不同字符的最长子串
Given a string S, find the length of the longest substring T that contains at most two distinct characters.
For example,
Given S = "eceba",
T is "ece" which its length is 3.
给一个字符串,找出最多有两个不同字符的最长子串。还是滑动窗口法,定义一个HashMap或者Array来存储出现过的字符个数,左右指针初始位子为0,右指针向右扫,扫到新字符不同字符数加1,存入HashMap,扫到出现过的字符,HashMap对应字符数量加1。如果不同字符数大于2了,就把左指针位置的字符在HashMap中的数量减1,注意不一定是这一个,如果此时这个字符的数量大于0,说明还有这个字符存在,左指针加1继续右移,扫到的字符以后不会在窗口里了,要在HashMap中减1,如果这个字符减1后为0了,说明这个字符在窗口中没有了,此时不同字符数就可减1,左指针在右移1位指向下一个字符,统计此时窗口长度与最大长度比较,保留最大值。重复上面步骤,直到右指针扫完所有字符。最后返回最大长度。
Java: T: O(n), S: O(1)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | public int lengthOfLongestSubstringTwoDistinct(String s) { int max= 0 ; HashMap<Character,Integer> map = new HashMap<Character, Integer>(); int start= 0 ; for ( int i= 0 ; i<s.length(); i++){ char c = s.charAt(i); if (map.containsKey(c)){ map.put(c, map.get(c)+ 1 ); } else { map.put(c, 1 ); } if (map.size()> 2 ){ max = Math.max(max, i-start); while (map.size()> 2 ){ char t = s.charAt(start); int count = map.get(t); if (count> 1 ){ map.put(t, count- 1 ); } else { map.remove(t); } start++; } } } max = Math.max(max, s.length()-start); return max; } |
Java:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | public int lengthOfLongestSubstringTwoDistinct(String s) { Map<Character, Integer> map = new HashMap<>(); int start = 0 , end = 0 ; int counter = 0 , len = 0 ; while (end < s.length()){ char cur = s.charAt(end); if (!map.containsKey(cur)) map.put(cur, 0 ); map.put(cur, map.get(cur) + 1 ); if (map.get(cur) == 1 ) counter++; //new distinct char while (counter > 2 ){ // char c2 = s.charAt(start); map.put(c2, map.get(c2) - 1 ); if (map.get(c2) == 0 ) counter--; start++; } len = Math.max(end - start + 1 , len); end++; } return len; } |
Python:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | class Solution: def lengthOfLongestSubstringTwoDistinct( self , s): longest, start, distinct_count, visited = 0 , 0 , 0 , [ 0 for _ in xrange ( 256 )] for i, char in enumerate (s): if visited[ ord (char)] = = 0 : distinct_count + = 1 visited[ ord (char)] + = 1 while distinct_count > 2 : visited[ ord (s[start])] - = 1 if visited[ ord (s[start])] = = 0 : distinct_count - = 1 start + = 1 longest = max (longest, i - start + 1 ) return longest |
C++:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | class Solution { public : int lengthOfLongestSubstringTwoDistinct(string s) { int res = 0, left = 0; unordered_map< char , int > m; for ( int i = 0; i < s.size(); ++i) { ++m[s[i]]; while (m.size() > 2) { if (--m[s[left]] == 0) m.erase(s[left]); ++left; } res = max(res, i - left + 1); } return res; } }; |
类似题目:
[LeetCode] 3.Longest Substring Without Repeating Characters 最长无重复子串
[LeetCode] 340. Longest Substring with At Most K Distinct Characters 最多有K个不同字符的最长子串
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架