1. 题目
2. 题意
题目几个关键信息:
- 该字符串只包含’a’,‘b’,'c’三种字符
- 示例1中发现对于相同但是位置不同的子串,是按两个结果计算,无需去掉重复
- 该字符串长度默认大于3
3. 方法
3.1 思路
最简单的思路就是暴力法,直接两个循环,并判断结果字符串是否都包含了’a’,‘b’,'c’三种字符。但该方法时间复杂度较高,O(n²),因此考虑有没有简单的做法。
题目是求符合条件的子串,这种要求很容易想到双指针
进行遍历。
3.2 代码
public int numberOfSubstrings(String s) {
int start = 0, end = 0, number = 0;
int[] nums = new int[3];
while (end < s.length()) {
// 向后遍历,并标记出现的字符
nums[s.charAt(end++) - 'a']++;
// 当三个字符都包含时,移动start指针
while (nums[0] > 0 && nums[1] > 0 && nums[2] > 0) {
// 将start指针向后移动,直到再次无法同时包含三个字符
// 这时,start的值也为以end下标为字符串末位的,符合条件的子字符串数
nums[s.charAt(start++) - 'a']--;
}
number += start;
}
return number;
}