题目
开头和结尾都是元音字母(aeiouAEIOU)的字符串为元音字符串,其中混杂的非元音字母数量为其瑕疵度。比如:
“a” 、 “aa”是元音字符串,其瑕疵度都为0
“aiur”不是元音字符串(结尾不是元音字符)
“abira”是元音字符串,其瑕疵度为2
给定一个字符串,请找出指定瑕疵度的最长元音字符子串,并输出其长度,如果找不到满足条件的元音字符子串,输出0。
子串:字符串中任意个连续的字符组成的子序列称为该字符串的子串。
输入描述
首行输入是一个整数,表示预期的瑕疵度flaw,取值范围[0, 65535]。
接下来一行是一个仅由字符a-z和A-Z组成的字符串,字符串长度(0, 65535]。
输出描述
输出为一个整数,代表满足条件的元音字符子串的长度。
用例
输入
1
aba
输出
3
解题思路
先通过遍历字符串提取所有元音字符的索引,然后使用双指针滑动窗口方法在这些索引间寻找符合条件的子串。滑动窗口的左右指针表示子串的起始和结束位置,通过计算两个元音字符之间的非元音字符数量(瑕疵度)来判断是否满足条件。如果瑕疵度超过给定值,则左指针右移;如果瑕疵度小于或等于给定值,且子串以元音开头和结尾,则更新最大子串长度。右指针继续右移,直到遍历完所有元音字符索引。最终输出满足条件的最长子串长度。
代码
def find_longest_vowel_substring(s, max_flaw):
vowels = {'a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U'}
vowel_indices = [i for i, char in enumerate(s) if char in vowels]
max_length = 0
left = 0
right = 0
n = len(vowel_indices)
while right < n:
start_idx = vowel_indices[left]
end_idx = vowel_indices[right]
non_vowel_count = end_idx - start_idx - (right - left)
if non_vowel_count > max_flaw:
left += 1
else:
if s[start_idx] in vowels and s[end_idx] in vowels and non_vowel_count == max_flaw:
max_length = max(max_length, end_idx - start_idx + 1)
right += 1
return max_length
if __name__ == "__main__":
flaw = int(input())
input_str = input().strip()
print(find_longest_vowel_substring(input_str, flaw))