华为OD机试 Python【最长的指定瑕疵度的元音子串】

博客介绍了如何解决华为机试中的一道问题:找到指定瑕疵度的最长元音子串。文章阐述了题目的要求,解题思路采用双指针滑动窗口方法遍历字符串,通过计算非元音字符数量判断是否满足条件,并更新最长子串长度。最后给出了相关代码实现。
摘要由CSDN通过智能技术生成

题目

开头和结尾都是元音字母(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))


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值