1358. 包含所有三种字符的子字符串数目
目录
- 一、题目
- 二、思路
- 2.1 解题思路
- 2.2 代码尝试
- 2.3 疑难问题
- 三、解法
- 四、收获
- 4.1 心得
- 4.2 举一反三
一、题目
二、思路
2.1 解题思路
滑动窗口+哈希表
2.2 代码尝试
class Solution {
public:
int numberOfSubstrings(string s) {
int l=0;
int len=s.size();
int count=0;
//用哈希表来存储出现次数
vector<int> p(3);//3个字母
for(int r=0;r<s.size();r++){
p[s[r]-'a']++;//每次遍历,对应哈希表+1
if(p[0]*p[1]*p[2]!=0){
count+=len-r;
p[s[l]-'a']--;
l++;
}
}
while(p[0]*p[1]*p[2]>0){
count++;
p[s[l]-'a']--;
l++;
}
return count;
}
};
能解出部分题目,感觉逻辑判断上差了一点,不能满足很多种情况。不过基本的路线应该没错,哈希表做判断。这道题有点变化,我感觉还是判断条件没找准。结构还是模板题。
2.3 疑难问题
三、解法
class Solution {
int cnt[3];
public:
int numberOfSubstrings(string s) {
int len=(int)s.length(),ans=0;
cnt[0]=cnt[1]=cnt[2]=0;
for (int l=0,r=-1;l<len;){
while (r<len && !(cnt[0]>=1 && cnt[1]>=1 && cnt[2]>=1)){
if (++r==len) break;
cnt[s[r]-'a']++;
}
ans+=len-r;
cnt[s[l++]-'a']--;
}
return ans;
}
};
作者:力扣官方题解
链接:https://leetcode.cn/problems/number-of-substrings-containing-all-three-characters/solutions/109170/bao-han-suo-you-san-chong-zi-fu-de-zi-zi-fu-chuan-/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
四、收获
4.1 心得
这题变化就在于之前每次都是窗口右边一点一点的动,然后左边快速收敛直至满足窗口条件。但是这道题变化的就是左边一点一点动,右边快速统计直到末尾。这道题变化的很好。
4.2 举一反三
尺蠖向哪边蠕动要看具体的规则判断情况。