
题目描述
给你一个由小写英文字母('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
17
18
19
20 | use std::collections::HashMap;
impl Solution {
pub fn max_freq_sum(s: String) -> i32 {
let mut cnt: HashMap<char, i32> = HashMap::new();
for c in s.chars() {
*cnt.entry(c).or_insert(0) += 1;
}
let mut a = 0;
let mut b = 0;
for (c, v) in cnt {
if "aeiou".contains(c) {
a = a.max(v);
} else {
b = b.max(v);
}
}
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;
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 | public class Solution {
public int MaxFreqSum(string s) {
int[] cnt = new int[26];
foreach (char c in s) {
cnt[c - 'a']++;
}
int a = 0, b = 0;
for (int i = 0; i < 26; i++) {
char c = (char)('a' + i);
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;
}
}
|