一、Problem
Given a string s consisting only of characters a, b and c.
Return the number of substrings containing at least one occurrence of all these characters a, b and c.
Input: s = "abcabc"
Output: 10
Explanation: The substrings containing at least one occurrence of the characters
a, b and c are "abc", "abca", "abcab", "abcabc", "bca", "bcab", "bcabc", "cab", "cabc" and "abc" (again).
二、Solution
方法一:雙指針
- 如果窗口
[l, r]
內部的字符 a、b、c 的個數都大於 0,證明子串s[l:r]
是合法的。 - 還可以推出此時的子串
s[l:r]
還可以和r
右邊的所有字符組成合法子串。
class Solution {
public int numberOfSubstrings(String S) {
int l = 0, r = 0, n = S.length(), cnt = 0, mp[] = new int[3];
char[] s = S.toCharArray();
while (r < n) {
mp[s[r]-'a']++;
while (mp[0] >= 1 && mp[1] >= 1 && mp[2] >= 1) {
cnt += n - r;
mp[s[l]-'a']--;
l++;
}
r++;
}
return cnt;
}
}
複雜度分析
- 時間複雜度:,
- 空間複雜度:,