码迷,mamicode.com
首页 > 其他好文 > 详细

Leetcode1358_包含所有三种字符的子字符串数目

时间:2020-03-02 11:12:20      阅读:48      评论:0      收藏:0      [点我收藏+]

标签:substring   端点   预处理   etc   href   ==   前缀和   abc   字符串   

题目地址
给定一个只含有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_包含所有三种字符的子字符串数目

标签:substring   端点   预处理   etc   href   ==   前缀和   abc   字符串   

原文地址:https://www.cnblogs.com/zxcoder/p/12392220.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!