华为OD机试 - 寻找最长元音子串的长度(C++/Java/JavaScript/Python详解)
在华为OD(Online Development)机试中,编程题目经常会考察应试者的字符串处理能力,尤其是涉及元音子串、子序列等经典问题。本篇博客将以一道名为“最长元音子串的长度”的题目为例,详细讲解题目要求,分析解题思路,并提供C++、Java、JavaScript和Python四种语言的代码实现。通过阅读本文,您将掌握如何高效地解决类似的字符串处理问题,并加深对常见算法题目的理解。
题目描述
给定一个由英文字母组成的字符串,您需要在其中找到最长的只由元音字母(a, e, i, o, u
)组成的连续子串,并返回这个子串的长度。如果找不到任何元音子串,则返回 0
。题目规定,字符串中可以包含大小写字母,因此在比较时需要忽略大小写。
输入格式
- 输入一个长度为
0 < length <= 10000
的字符串,字符串仅由英文字母组成。
输出格式
- 输出一个整数,表示找到的最长元音子串的长度。如果找不到元音子串,则输出
0
。
题目示例
输入:
asdbuiodevauufgh
输出:
3
解释:
在输入的字符串中,最长的元音字符子串有两个:uio
和 auu
,它们的长度都为 3
,因此输出结果为 3
。
解题思路
1. 理解题目
首先,题目要求我们在给定的字符串中找到最长的连续元音子串,并返回其长度。元音字母包括 a, e, i, o, u
,不区分大小写。在这个问题中,字符串的长度可能达到 10000 个字符,因此我们需要设计一种高效的算法来解决问题。
2. 解题步骤
我们可以按照以下步骤来解决这个问题:
-
遍历字符串:依次遍历字符串的每个字符,并判断该字符是否是元音。
-
维护当前子串的长度:如果当前字符是元音,我们将当前元音子串的长度加一;如果遇到非元音字符,则将当前元音子串的长度与全局最大长度进行比较,并重置当前元音子串长度。
-
更新结果:遍历结束后,确保我们在最后一次比较时没有漏掉更新最大元音子串长度的操作。
3. 使用双指针或贪心算法?
对于这个问题,我们可以通过遍历字符串并维护两个变量来解决:一个是当前正在遍历的元音子串长度,另一个是记录最大元音子串长度的变量。这是一种贪心算法,专注于当前的最优解。
4. 时间复杂度分析
由于我们只需要遍历字符串一次,并在遍历过程中维护一些简单的状态信息,因此算法的时间复杂度是 O(n)
,其中 n
是字符串的长度。这个复杂度足以应对最长为 10000 的字符串。
代码实现
接下来,我们将展示该题目的 C++、Java、JavaScript 和 Python 的解决方案,并逐行解析每段代码。
C++ 代码实现
#include <iostream> // 用于标准输入输出
#include <vector> // 使用vector存储元音字母
#include <algorithm> // 使用find算法
using namespace std;
int main() {
string input_str;
getline(cin, input_str); // 读取输入的整个字符串
// 定义元音字母集合,方便后续判断
vector<char> vowels = {
'a', 'e', 'i', 'o', 'u'};
int max_len = 0, cur_len = 0; // max_len记录最长元音子串长度,cur_len记录当前元音子串长度
for (char c : input_str) {
// 遍历字符串中的每个字符
// 判断当前字符是否是元音字母(忽略大小写)
if (find(vowels