
题目描述
给你一个由小写英文字母('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\)。
| 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
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 | 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;
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 | 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;
}
};
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 | 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
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 | 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;
}
|