一、统计字符串中元音子字符串

题意:

给定一个只含小写字母的字符串,需要求只包含元音字符的子字符串个数

其中:

  • 1 <= word.length <= 100
  • word 仅由小写英文字母组成

示例:

示例1:

输入:word = “aeiouu”
输出:2
解释:下面列出 word 中的元音子字符串(斜体加粗部分):

  • “aeiouu”
  • “aeiouu”

示例2:

输入:word = “cuaieuouac”
输出:7
解释:下面列出 word 中的元音子字符串(斜体加粗部分):

  • “cuaieuouac”
  • “cuaieuouac”
  • “cuaieuouac”
  • “cuaieuouac”
  • “cuaieuouac”
  • “cuaieuouac”
  • “cuaieuouac”

示例3:

输入:word = “bbaeixoubb”
输出:0
解释:所有包含全部五种元音的子字符串都含有辅音,所以不存在元音子字符串。

题解:

由于字符串长度<=100,直接暴力即可,随便怎么暴力都行,这里由于时间因素,当时直接选择三重for循环

class Solution {
public:
    int countVowelSubstrings(string s) {
        int len=s.length();
        set<char>st;
        int ans=0;
        for(int i=0;i<len;i++){
            for(int j=i;j<len;j++){
                st.clear();
                for(int k=i;k<=j;k++){
                    st.insert(s[k]);
                }
                if(st.size()==5&&st.count('a')&&st.count('e')&&st.count('i')&&st.count('o')&&st.count('u')){
                    ans++;
                }
            }
        }
        return ans;
    }
};

二、所有子字符串中的元音

题意:

给定一个字符串,返回所有字符串中元音的总数

其中:

  • 1 <= word.length <= 105
  • word 由小写英文字母组成

示例:

示例1:

输入:word = “aba”
输出:6
解释:
所有子字符串是:”a”、”ab”、”aba”、”b”、”ba” 和 “a” 。

  • “b” 中有 0 个元音
  • “a”、”ab”、”ba” 和 “a” 每个都有 1 个元音
  • “aba” 中有 2 个元音
    因此,元音总数 = 0 + 1 + 1 + 1 + 1 + 2 = 6 。

示例2:

输入:word = “abc”
输出:3
解释:
所有子字符串是:”a”、”ab”、”abc”、”b”、”bc” 和 “c” 。

  • “a”、”ab” 和 “abc” 每个都有 1 个元音
  • “b”、”bc” 和 “c” 每个都有 0 个元音
    因此,元音总数 = 1 + 1 + 1 + 0 + 0 + 0 = 3 。

示例3:

输入:word = “noosabasboosa”
输出:237
解释:所有子字符串中共有 237 个元音。

题解:

遍历字符串,若当前遍历元素$word[i]$为元音时,则若存在子字符串$word[l…r]$要包含字符$word[i]$,则

  • $0 \le l \le i$
  • $i \le r<n$(n为字符串word的长度)

于是代码如下

class Solution {
public:
    long long countVowels(string word) {
        int n=word.length();
        long long ans=0;
        for(int i=0;i<n;i++){
            if(word[i]=='a'||word[i]=='e'||word[i]=='i'||word[i]=='o'||word[i]=='u'){
                ans+=(long long)(i+1)*(n-i);
            }
        }
        return ans;
    }
};

三、分配给商店的最多商品的最小值

题意:

给你一个整数 n ,表示有 n 间零售商店。总共有 m 种产品,每种产品的数目用一个下标从 0 开始的整数数组 quantities 表示,其中 quantities[i] 表示第 i 种商品的数目。

你需要将 所有商品 分配到零售商店,并遵守这些规则:

一间商店 至多 只能有 一种商品 ,但一间商店拥有的商品数目可以为 任意 件。
分配后,每间商店都会被分配一定数目的商品(可能为 0 件)。用 x 表示所有商店中分配商品数目的最大值,你希望 x 越小越好。也就是说,你想 最小化 分配给任意商店商品数目的 最大值 。
请你返回最小的可能的 x 。

示例:

示例1:

输入:n = 6, quantities = [11,6]
输出:3
解释: 一种最优方案为:

  • 11 件种类为 0 的商品被分配到前 4 间商店,分配数目分别为:2,3,3,3 。
  • 6 件种类为 1 的商品被分配到另外 2 间商店,分配数目分别为:3,3 。
    分配给所有商店的最大商品数目为 max(2, 3, 3, 3, 3, 3) = 3 。

示例2:

输入:n = 7, quantities = [15,10,10]
输出:5
解释:一种最优方案为:

  • 15 件种类为 0 的商品被分配到前 3 间商店,分配数目为:5,5,5 。
  • 10 件种类为 1 的商品被分配到接下来 2 间商店,数目为:5,5 。
  • 10 件种类为 2 的商品被分配到最后 2 间商店,数目为:5,5 。
    分配给所有商店的最大商品数目为 max(5, 5, 5, 5, 5, 5, 5) = 5 。

示例3:

输入:n = 1, quantities = [100000]
输出:100000
解释:唯一一种最优方案为:

  • 所有 100000 件商品 0 都分配到唯一的商店中。
    分配给所有商店的最大商品数目为 max(100000) = 100000 。

题解:

直接二分答案即可。

class Solution {
public:
    int minimizedMaximum(int n, vector<int>& quantities) {
        int m=quantities.size();
        int l=1,r=100000;
        while(l<=r){
            int mid=(l+r)>>1;
            int cnt=0;
            for(int i=0;i<m;i++){
                cnt+=quantities[i]/mid;
                if(quantities[i]%mid) cnt+=1;
            }
            if(cnt<=n){
                r=mid-1;
            }else{
                l=mid+1;
            }
        }
        return l;
    }
};