LeetCode第 266 场周赛

2062. 统计字符串中的元音子字符串

1、找出连续含aeiou字符串
可以通过预处理出每个元音后的下一个非元音
2、然后双指针
以uaieuoua为例
七种方案如下
前面删0个字符 后面删0个 uaieuoua是一种方案
前面删0个字符 后面删1个 uaieuou
前面删0个字符 后面删2个 uaieuo
前面删1个字符 后面删0个 aieuoua
前面删1个字符 后面删1个 aieuou
前面删1个字符 后面删2个 aieuo
前面删2个字符 后面删0个 ieuoua

    int countVowelSubstrings(string s) {
        int n=s.size(),temp=n;
        vector<int>a(100,n);
        vector<bool>flag(100,false);
        for(int i=n-1;i>=0;i--)
        {
            if(s[i]=='a'||s[i]=='e'||s[i]=='i'||s[i]=='o'||s[i]=='u')
            {
                a[i]=temp;
                flag[i]=true;
            }
            else temp=i;
        }
        int res=0;
        for(int i=0;i<n;i++)
        {
            if(flag[i])
            {
                string p=s.substr(i,a[i]-1 -i +1);//连续元音字符
                int m=p.size();
                vector<int>b(6,0);
                for(int j=0;j<m;j++)
                {
                    if(p[j]=='a')b[1]++;
                    if(p[j]=='e')b[2]++;
                    if(p[j]=='i')b[3]++;
                    if(p[j]=='o')b[4]++;
                    if(p[j]=='u')b[5]++;
                }
                if(!(b[1]&&b[2]&&b[3]&&b[4]&&b[5]))continue;
                  vector<int>c(6,0);//存
               for(int j=0;j<m;j++)//删前j个元素
                {
                    for(int k=1;k<=5;k++)c[k]=b[k];
                    int k=m-1;
                    while(b[1]&&b[2]&&b[3]&&b[4]&&b[5])
                    {
                       //for(int z=j;z<=k;z++)cout<<p[z];
                       cout<<endl;
                        res++;
                        if(p[k]=='a')b[1]--;
                        if(p[k]=='e')b[2]--;
                        if(p[k]=='i')b[3]--;
                        if(p[k]=='o')b[4]--;
                        if(p[k]=='u')b[5]--;
                        k--;
                    }
                      for(int k=1;k<=5;k++)b[k]=c[k];
                
                if(p[j]=='a')b[1]--;
                        if(p[j]=='e')b[2]--;
                        if(p[j]=='i')b[3]--;
                        if(p[j]=='o')b[4]--;
                        if(p[j]=='u')b[5]--;
                }
            //    cout<<p<<endl;
                i=a[i]-1;
            }
        }
        return res;
        
    }

2063. 所有子字符串中的元音

long long countVowels(string s) {
          int n=s.size();
          long long res=0;
          for(int i=0;i<n;i++)
          {
              if(s[i]=='a'||s[i]=='e'||s[i]=='i'||s[i]=='o'||s[i]=='u')res+=(long long) (i+1)*(n-1-i+1);
              //例子cccacc
              //i为3 前i+1个乘以后面0.1.2...共(n-i)个字符
          }
       
        return res;
        
    }

2064. 分配给商店的最多商品的最小值

二分
因为店比商品种类多 所以最多的商品肯定可以是产品数中的最大值

    int minimizedMaximum(int m, vector<int>& c) {//m家店 n种产品
        int  n=c.size();
        sort(c.begin(),c.end());
        int l=1,r=c[n-1];
        while(l<r)
        {
            int mid=l+r>>1;
            int need=0;
            for(auto x:c)
            {
                need+=(x)/mid;
                if(x%mid)need++;
            }
            if(need<=m)r=mid;//店铺放得下 mid可以是最大值
            else l=mid+1;
        }
        return l; 
    }

2065. 最大化一张图中的路径价值

https://leetcode-cn.com/problems/maximum-path-quality-of-a-graph/
这题重在读题
每个节点 至多 有 四条 边与之相连。
10 <= timej, maxTime <= 100
说明最多往下十层 就算每次都是四种选择 时间复杂度 4的10次方 2^20一百万可以接受
所以选择暴搜
具体做法
无向图遍历 遍历过的点需要打标记,因为节点价值只记一次。
如果当前点是0更新最大值。

int ans=0;
void dfs(int ver,int sum,int time,vector <vector<pair<int,int>>>& e,vector<int>& v, int maxTime, vector<bool>& f)
{
    if(time>maxTime)return ;
   if(ver==0){
       ans=max(ans,sum);
   }
   for(auto x: e[ver])
   {
       int u=x.first,quan=x.second;
       if(f[u]) dfs(u,sum,time+quan,e,v,maxTime,f);
       else
       {
           f[u]=true;
            dfs(u,sum+v[u],time+quan,e,v,maxTime,f);
            f[u]=false;
       }  
   }
}
    int maximalPathQuality(vector<int>& v, vector<vector<int>>& edges, int maxTime) {
        int n=v.size();
        vector<pair<int,int>>w;
        vector <vector<pair<int,int>>>e(n,w);
        vector<bool>f(n,false);
        for(auto x:edges)
        {
            e[x[0]].push_back({x[1],x[2]});
            e[x[1]].push_back({x[0],x[2]});
        }
        f[0]=true;
        dfs(0,v[0],0,e,v,maxTime,f);//当前点 当前价值 当前时间 
        return ans;  
    }

posted @ 2021-11-09 11:55  liv_vil  阅读(49)  评论(0)    收藏  举报