🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员
✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解
💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导
👏 感谢大家的订阅➕ 和 喜欢💗
📎在线评测链接
https://app5938.acapp.acwing.com.cn/contest/2/problem/OD1062
🌍 评测功能需要 ⇒ 订阅专栏 ⇐ 后私信联系清隆解锁~
🍓OJ题目截图
文章目录
- 📎在线评测链接
- 🍓OJ题目截图
- ✈️ 最长的指定瑕疵度的元音子串
- 问题描述
- 输入格式
- 输出格式
- 样例输入
- 样例输出
- 样例说明
- 样例输入
- 样例输出
- 样例说明
- 样例输入
- 样例输出
- 样例说明
- 数据范围
- 题解
- 参考代码
✈️ 最长的指定瑕疵度的元音子串
问题描述
K小姐正在研究一个字符串问题。在这个问题中,如果一个字符串的开头和结尾都是元音字母( a a a、 e e e、 i i i、 o o o、 u u u、 A A A、 E E E、 I I I、 O O O、 U U U),那么它就被称为元音字符串。元音字符串中非元音字母的数量定义为该字符串的瑕疵度。例如:
- “ a a a” 和 “ a a aa aa” 都是元音字符串,它们的瑕疵度为 0 0 0。
- “ a i u r aiur aiur” 不是元音字符串,因为它的结尾不是元音字母。
- “ a b i r a abira abira” 是一个元音字符串,它的瑕疵度为 2 2 2。
现在,给定一个字符串和一个目标瑕疵度,请你找出具有指定瑕疵度的最长元音子串,并输出其长度。如果不存在满足条件的元音子串,则输出 0 0 0。
注意:字符串中任意连续的字符组成的子序列称为该字符串的子串。
输入格式
第一行包含一个整数 f l a w flaw flaw,表示目标瑕疵度,满足 0 ≤ f l a w ≤ 65535 0 \leq flaw \leq 65535 0≤flaw≤65535。
第二行包含一个字符串 s t r str str,仅由小写字母和大写字母组成,满足 1 ≤ ∣ s t r ∣ ≤ 65535 1 \leq |str| \leq 65535 1≤∣str∣≤65535。
输出格式
输出一个整数,表示满足条件的最长元音子串的长度。如果不存在满足条件的元音子串,则输出 0 0 0。
样例输入
0
asdbuiodevauufgh
样例输出
3
样例说明
在给定的字符串中,满足条件的最长元音子串有 “ u i o uio uio” 和 “ a u u auu auu”,它们的长度都为 3 3 3。
样例输入
2
aeueo
样例输出
0
样例说明
在给定的字符串中,不存在满足条件的元音子串,因此输出为 0 0 0。
样例输入
1
aabeebuu
样例输出
5
样例说明
在给定的字符串中,满足条件的最长元音子串有 “ a a b e e aabee aabee” 和 “ e e b u u eebuu eebuu”,它们的长度都为 5 5 5。
数据范围
- 0 ≤ f l a w ≤ 65535 0 \leq flaw \leq 65535 0≤flaw≤65535
- 1 ≤ ∣ s t r ∣ ≤ 65535 1 \leq |str| \leq 65535 1≤∣str∣≤65535
题解
题目要求找出指定瑕疵度的最长元音子串。首先筛选出所有元音字符的位置,然后使用双指针技术维护当前子串的瑕疵度。如果瑕疵度小于指定值,右指针右移;如果瑕疵度大于指定值,左指针右移;如果恰好等于指定值,更新答案并尝试扩展右指针以探索可能的更长子串。
参考代码
- Python
def longest_vowel_substring(flaw, s):
vowels = set("aeiouAEIOU")
indices = [i for i, char in enumerate(s) if char in vowels]
max_length = 0
l = 0
for r in range(len(indices)):
while indices[r] - indices[l] - (r - l) > flaw:
l += 1
if indices[r] - indices[l] - (r - l) == flaw:
max_length = max(max_length, indices[r] - indices[l] + 1)
return max_length
flaw = int(input())
s = input()
print(longest_vowel_substring(flaw, s))
- Java
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int flaw = sc.nextInt();
String s = sc.next();
System.out.println(getResult(flaw, s));
}
public static int getResult(int flaw, String s) {
Set<Character> vowels = new HashSet<>(Arrays.asList('a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U'));
List<Integer> indices = new ArrayList<>();
for (int i = 0; i < s.length(); i++) {
if (vowels.contains(s.charAt(i))) indices.add(i);
}
int maxLen = 0;
int l = 0;
for (int r = 0; r < indices.size(); r++) {
while (indices.get(r) - indices.get(l) - (r - l) > flaw) l++;
if (indices.get(r) - indices.get(l) - (r - l) == flaw) {
maxLen = Math.max(maxLen, indices.get(r) - indices.get(l) + 1);
}
}
return maxLen;
}
}
- Cpp
#include <iostream>
#include <vector>
#include <set>
#include <string>
using namespace std;
int longestVowelSubstring(int flaw, const string& s) {
set<char> vowels{'a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U'};
vector<int> indices;
// 收集所有元音字符的位置
for (int i = 0; i < s.length(); i++) {
if (vowels.find(s[i]) != vowels.end()) {
indices.push_back(i);
}
}
int maxLen = 0;
int l = 0;
// 使用双指针技术来找到满足瑕疵度的最长元音子串
for (int r = 0; r < indices.size(); r++) {
// 调整左指针直到子串的瑕疵度不大于指定瑕疵度
while (indices[r] - indices[l] - (r - l) > flaw) {
l++;
}
// 检查当前元音子串是否满足瑕疵度要求
if (indices[r] - indices[l] - (r - l) == flaw) {
maxLen = max(maxLen, indices[r] - indices[l] + 1);
}
}
return maxLen;
}
int main() {
int flaw;
string s;
// 从标准输入读取瑕疵度和字符串
cin >> flaw;
cin >> s;
// 计算和输出结果
cout << longestVowelSubstring(flaw, s) << endl;
return 0;
}