【LeetCode 每日一题】3541. 找到频率最高的元音和辅音
Problem: 3541. 找到频率最高的元音和辅音
文章目录
- 整体思路
- 完整代码
- 时空复杂度
- 时间复杂度:O(N)
- 空间复杂度:O(N)
整体思路
这段代码的目的是计算一个给定字符串 s
中,单个元音字母的最大出现频率与单个辅音字母的最大出现频率之和。
该算法采用了一种高效的 单次遍历 结合 频率计数 的策略来解决问题。它在一次遍历中同时完成了所有必要信息的收集和更新。
其核心逻辑步骤如下:
-
数据结构与初始化:
- 算法使用一个大小为 26 的整型数组
fre
来作为频率计数器(或哈希表),fre[i]
存储字符'a' + i
的出现次数。这基于一个假设:输入字符串s
只包含小写英文字母。 - 初始化两个变量
vowel
和consonant
为 0。这两个变量将分别用于动态追踪在遍历过程中遇到的元音和辅音的历史最高频率。
- 算法使用一个大小为 26 的整型数组
-
单次遍历与动态更新:
- 算法通过一个
for-each
循环遍历字符串s
(已转换为字符数组)中的每一个字符c
。 - 对于每个字符
c
,执行以下操作:
a. 更新频率:fre[c - 'a']++
,将当前字符的频率加一。
b. 分类:通过一个if
语句判断c
是元音还是辅音。
c. 更新最大值:
* 如果c
是元音,就用它当前的频率fre[c - 'a']
与已经记录的元音最大频率vowel
进行比较,并将vowel
更新为较大者。
* 如果c
是辅音,同理,更新consonant
的值。 - 这个动态更新是算法的关键。例如,对于字符串 “banana”,当遍历到第三个 ‘a’ 时,
fre['a'-'a']
变为 3,vowel
也会被更新为 3。vowel
和consonant
始终保存着到目前为止,所有元音/辅音中出现过的最高频次。
- 算法通过一个
-
返回结果:
- 在遍历完整个字符串后,
vowel
变量中存储的就是所有元音字母中的最高频率,而consonant
变量中存储的就是所有辅音字母中的最高频率。 - 最后,函数返回这两个值的和
vowel + consonant
。
- 在遍历完整个字符串后,
完整代码
class Solution {/*** 计算字符串中单个元音的最大频率与单个辅音的最大频率之和。* @param s 输入的字符串(假定只包含小写英文字母)* @return 元音最大频率 + 辅音最大频率*/public int maxFreqSum(String s) {// fre: 用于存储每个小写字母的频率。fre[0] for 'a', fre[1] for 'b', ...int[] fre = new int[26];// vowel: 用于追踪遍历过程中遇到的元音的最高频率int vowel = 0;// consonant: 用于追踪遍历过程中遇到的辅音的最高频率int consonant = 0;// 遍历字符串中的每一个字符for (char c : s.toCharArray()) {// 增加当前字符的频率计数fre[c - 'a']++;// 判断当前字符是元音还是辅音if (c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u') {// 如果是元音,用其当前频率更新元音的历史最高频率vowel = Math.max(vowel, fre[c - 'a']);} else {// 如果是辅音,用其当前频率更新辅音的历史最高频率consonant = Math.max(consonant, fre[c - 'a']);}}// 返回追踪到的元音最大频率和辅音最大频率之和return vowel + consonant;}
}
时空复杂度
时间复杂度:O(N)
- 字符串转换:
s.toCharArray()
会创建一个字符串s
的字符数组副本。如果字符串长度为N
,这个操作的时间复杂度是 O(N)。 - 循环:
for (char c : ...)
循环会遍历整个字符数组一次,执行N
次。 - 循环内部操作:循环内部的数组访问、比较和
Math.max
都是 O(1) 的常数时间操作。
综合分析:
算法的总时间复杂度由字符串转换和线性扫描决定。因此,其时间复杂度为 O(N),其中 N
是字符串 s
的长度。
空间复杂度:O(N)
- 主要存储开销:
int[] fre = new int[26]
: 频率数组的大小是固定的 26,不随输入N
的大小变化。因此,它占用 O(1) 的常数空间。s.toCharArray()
: 这个方法会创建一个新的字符数组来存储字符串的内容。这个新数组的长度与输入字符串s
的长度N
相同,占用 O(N) 的空间。
综合分析:
算法所需的额外空间主要由 toCharArray()
创建的副本决定。因此,其空间复杂度为 O(N)。