3541. 找到频率最高的元音和辅音

English Version

题目描述

给你一个由小写英文字母('a''z')组成的字符串 s。你的任务是找出出现频率 最高 的元音('a''e''i''o''u' 中的一个)和出现频率最高的辅音(除元音以外的所有字母),并返回这两个频率之和。

注意:如果有多个元音或辅音具有相同的最高频率,可以任选其中一个。如果字符串中没有元音或没有辅音,则其频率视为 0。

一个字母 x 的 频率 是它在字符串中出现的次数。

 

示例 1:

输入: s = "successes"

输出: 6

解释:

  • 元音有:'u' 出现 1 次,'e' 出现 2 次。最大元音频率 = 2。
  • 辅音有:'s' 出现 4 次,'c' 出现 2 次。最大辅音频率 = 4。
  • 输出为 2 + 4 = 6

示例 2:

输入: s = "aeiaeia"

输出: 3

解释:

  • 元音有:'a' 出现 3 次,'e' 出现 2 次,'i' 出现 2 次。最大元音频率 = 3。
  • s 中没有辅音。因此,最大辅音频率 = 0。
  • 输出为 3 + 0 = 3

 

提示:

  • 1 <= s.length <= 100
  • s 只包含小写英文字母

解法

方法一:计数

我们先用一个哈希表或者一个长度为 $26$ 的数组 $\textit{cnt}$ 统计每个字母的出现频率。然后我们遍历这个表,找出元音和辅音中出现频率最高的字母,返回它们的频率之和。

我们可以用一个变量 $\textit{a}$ 记录元音的最大频率,另一个变量 $\textit{b}$ 记录辅音的最大频率。遍历时,如果当前字母是元音,就更新 $\textit{a}$;否则就更新 $\textit{b}$。

最后返回 $\textit{a} + \textit{b}$ 即可。

时间复杂度 $O(n)$,其中 $n$ 是字符串的长度。空间复杂度 $(|\Sigma|)$,其中 $|\Sigma|$ 是字母表的大小,这里是 $26$。

Python3

class Solution:
    def maxFreqSum(self, s: str) -> int:
        cnt = Counter(s)
        a = b = 0
        for c, v in cnt.items():
            if c in "aeiou":
                a = max(a, v)
            else:
                b = max(b, v)
        return a + b

Java

class Solution {
    public int maxFreqSum(String s) {
        int[] cnt = new int[26];
        for (char c : s.toCharArray()) {
            ++cnt[c - 'a'];
        }
        int a = 0, b = 0;
        for (int i = 0; i < cnt.length; ++i) {
            char c = (char) (i + 'a');
            if (c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u') {
                a = Math.max(a, cnt[i]);
            } else {
                b = Math.max(b, cnt[i]);
            }
        }
        return a + b;
    }
}

C++

class Solution {
public:
    int maxFreqSum(string s) {
        int cnt[26]{};
        for (char c : s) {
            ++cnt[c - 'a'];
        }
        int a = 0, b = 0;
        for (int i = 0; i < 26; ++i) {
            char c = 'a' + i;
            if (c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u') {
                a = max(a, cnt[i]);
            } else {
                b = max(b, cnt[i]);
            }
        }
        return a + b;
    }
};

Go

func maxFreqSum(s string) int {
	cnt := [26]int{}
	for _, c := range s {
		cnt[c-'a']++
	}
	a, b := 0, 0
	for i := range cnt {
		c := byte(i + 'a')
		if c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u' {
			a = max(a, cnt[i])
		} else {
			b = max(b, cnt[i])
		}
	}
	return a + b
}

TypeScript

function maxFreqSum(s: string): number {
    const cnt: number[] = Array(26).fill(0);
    for (const c of s) {
        ++cnt[c.charCodeAt(0) - 97];
    }
    let [a, b] = [0, 0];
    for (let i = 0; i < 26; ++i) {
        const c = String.fromCharCode(i + 97);
        if ('aeiou'.includes(c)) {
            a = Math.max(a, cnt[i]);
        } else {
            b = Math.max(b, cnt[i]);
        }
    }
    return a + b;
}