LeetCode 159 至多包含两个不同字符的最长子串

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;
}