LeetCode 159 至多包含两个不同字符的最长子串
题目:
给你一个字符串 s ,请你找出 至多 包含 两个不同字符 的最长子串,并返回该子串的长度。
示例 1:
输入:s = "eceba"
输出:3
解释:满足题目要求的子串是 "ece" ,长度为 3 。
示例 2:
输入:s = "ccaabbb"
输出:5
解释:满足题目要求的子串是 "aabbb" ,长度为 5 。
提示:
1 <= s.length <= 105
s 由英文字母组成
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/longest-substring-with-at-most-two-distinct-characters
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
题解:
此题使用双指针加滑动窗口来求解,主要需要注意边界条件
解题思路:
1.因为题目要求字串包含至多两个不同字符,我们使用长度为2的数据保存当前计数的字符 twoChar
2.使用快慢指针,快指针遍历,慢指针总是指向和快指针上一个计数字符的起点
比如 aabbccd 如果快指针此刻正在计数c,那么慢指针指向第一个b位置,
这样我们可以保证从快指针到慢指针的范围内,一定只有b和c两种字符
3.每次当快指针指向和当前计数的两种字符都不同的字符时候,我们需要计算之前计数的长度,然后替换
新的计数字符,且开始计数的值需加上快慢指针之间的字符数
代码:
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) { if (s.length() == 1) return 1; char[] towC = new char[]{'-', '-'}; char[] chars = s.toCharArray(); int p1 = 0; int p2 = 0; towC[0] = chars[0]; int maxLen = 1; int len = 1; while (++p2 < chars.length) { if (chars[p2] == towC[0] || chars[p2] == towC[1]) { if (chars[p2] != chars[p2 - 1]) { p1 = p2; } len++; }else if (towC[1] == '-') { towC[1] = chars[p2]; p1 = p2; len++; }else{ maxLen = Math.max(maxLen, len); len = p2 - p1 + 1; if (towC[0] == chars[p1]) { towC[1] = chars[p2]; } else { towC[0] = chars[p2]; } p1 = p2; } } maxLen = Math.max(maxLen, len); return maxLen; }
|