所有元音按顺序排布的最长子字符串
难度:
标签:
题目描述
代码结果
运行时间: 124 ms, 内存: 24.0 MB
/*
* 思路:
* 1. 使用流处理方法遍历字符串。
* 2. 使用变量记录当前的元音顺序和计数器。
* 3. 当检测到一个新的元音字符时,检查其是否符合字典序的要求,
* 如果符合,继续;否则,重置当前记录。
* 4. 记录最长的符合条件的子字符串长度。
*/
import java.util.stream.IntStream;
public int longestBeautifulSubstring(String word) {
String vowels = "aeiou";
int[] result = {0, 0, 0, 'a' - 1}; // {maxLength, currentLength, vowelCount, prevChar}
IntStream.range(0, word.length()).forEach(i -> {
char c = word.charAt(i);
if (vowels.indexOf(c) == -1) return;
if (c > result[3]) {
result[3] = c;
result[2]++;
}
if (vowels.indexOf(c) == vowels.indexOf((char)result[3])) {
result[1]++;
} else {
result[1] = (c == 'a') ? 1 : 0;
result[2] = (c == 'a') ? 1 : 0;
result[3] = c;
}
if (result[2] == 5) {
result[0] = Math.max(result[0], result[1]);
}
});
return result[0];
}
解释
方法:
此题解采用了两个关键步骤来找到最长的美丽子字符串。首先,使用groupby函数从itertools库来聚合连续相同的字符,从而便于后续处理。第二步,将原字符串中连续相同的字符压缩成一个字符形成新的字符串ch_str,并将每组字符的长度存入列表g_list。然后,此解法通过在ch_str中找到'aeiou'这一特定模式的所有出现位置,并计算出从每个位置开始的连续五组字符的总长度,这样可以确保找到的子字符串符合美丽字符串的要求。最后,比较所有符合条件的子字符串长度,返回最长的一个。
时间复杂度:
O(n)
空间复杂度:
O(n)
代码细节讲解
🦆
为什么在处理字符串时首先使用groupby来聚合连续相同的字符?这样做有什么好处?
▷🦆
在创建ch_str时,为什么选择将连续相同的字符压缩成一个字符,这对找出最长美丽子字符串有何影响?
▷🦆
题解中提到,计算ch_str中'aeiou'模式出现的次数和位置,这种方法是否能确保每个'aeiou'都代表一个完整的并且符合条件的子字符串?
▷🦆
在计算每个'aeiou'开始的五个组合字符的总长度时,如何处理边界情况,比如'aeiou'模式出现在字符串末尾或长度不足五个字符的情况?
▷