Leetcode1358_包含所有三种字符的子字符串数目
Posted zxCoder
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Leetcode1358_包含所有三种字符的子字符串数目相关的知识,希望对你有一定的参考价值。
题目地址
给定一个只含有abc的字符串,要求包含abc分别各一个的子串个数。
- 预处理每种字符前缀和,枚举子串左端点,二分查找满足条件的右端点,三个字符取最大的,直接计数。
- 双指针。
code1
class Solution {
public:
int numberOfSubstrings(string s) {
int n=s.size();
vector<vector<int>> p(3,vector<int>(n+1,0));
for(int i=1;i<=n;i++){
for(int j=0;j<3;j++){
p[j][i]=p[j][i-1];
}
p[s[i-1]-'a'][i]=p[s[i-1]-'a'][i-1]+1;
}
long long ans=0;
for(int i=0;i<n;i++){
int mx=0;
for(int j=0;j<3;j++){
int k=lower_bound(p[j].begin(),p[j].end(),p[j][i]+1)-p[j].begin();
mx=max(mx,k);
}
if(mx>n){
break;
}
ans+=(n+1-mx)*1ll;
}
return ans;
}
};
code2
class Solution {
public:
int numberOfSubstrings(string s) {
int n=s.size();
int ans=0;
int vis[3]={};
int cnt=0;
for(int l=0,r=-1;l<n;l++){
while(r+1<n && cnt<3){
if(++vis[s[++r]-'a']==1){
cnt++;
}
}
if(cnt==3){
ans+=n-r;
}
if(--vis[s[l]-'a']==0){
cnt--;
}
}
return ans;
}
};
以上是关于Leetcode1358_包含所有三种字符的子字符串数目的主要内容,如果未能解决你的问题,请参考以下文章
#yyds干货盘点# LeetCode面试题:串联所有单词的子串
算法leetcode|30. 串联所有单词的子串(rust重拳出击)