leetcode 1358. 包含所有三种字符的子字符串数目 中等

📅 2026/7/1 19:08:06
leetcode 1358. 包含所有三种字符的子字符串数目 中等
给你一个字符串s它只包含三种字符 a, b 和 c 。请你返回 ab 和 c 都至少出现过一次的子字符串数目。示例 1输入s abcabc输出10解释包含 ab 和 c 各至少一次的子字符串为abc, abca, abcab, abcabc, bca, bcab, bcabc, cab, cabc和abc(相同字符串算多次)。示例 2输入s aaacb输出3解释包含 ab 和 c 各至少一次的子字符串为aaacb, aacb和acb 。示例 3输入s abc输出1提示3 s.length 5 x 10^4s只包含字符 ab 和 c 。分析如果字符串的某个字串中 a,b,c 都至少出现过一次则从这个字串开始向右增长的子串一定全部符合题目要求。假设当前子串在原字符串 s 中出现在下标 [j,i]则 [j,i1], [j,i2],······,[j,s.length()-1] 这些所有的字符串都符合条件总共 length-i 个。因此可以用双指针j 指向当前字符串的开头i 指向当前字符串的末尾一个数组 cnt[3] 代表 a,b,c 三个字符出现的次数。当 cnt[0]、cnt[1]、cnt[2] 都不为空时说明当前子串 [j,i] 中 a,b,c 都至少出现过一次此时答案增加 length-i并将 j 向右移动直到新的字串不符合题目要求位置。这样遍历完整个字符串即可得到答案。class Solution { public: int numberOfSubstrings(string s) { int ans0,lens.length(),cnt[5]{0};cnt[s[0]-a]; for(int i1,j0;s[i];i) { cnt[s[i]-a]; while(i-j2cnt[0]cnt[1]cnt[2]) anslen-i,cnt[s[j]-a]--,j; } return ans; } };