题目:华为机试od最长指定瑕疵度的元音字符串长度
开头和结尾都是元音字母(aeiouAEIOU)的字符串为元音字符串,其中混杂的非元音字母数量为其瑕疵度。
比如: 1.“a”、“aa”是元音字符串,其瑕疵度都为0
2.“aiur”不是元音字符串(结尾不是元音字符)
3.“abira”是元音字符串,其瑕疵度为2
给定一个字符串,和指定瑕疵度数量要求返回最大子字符串长度,假如没有返回0
思路:双指针法
1. 先考虑对输入字符串是否为元音字符串的做个判断,假若不是,直接返回0
2. 是元音字符串的前提判断,其中包含的字符中非元音个数与指定瑕疵度输入数量即返回字串中非元音个数的关系;
- 假若输入字符中非元音个数只有2个,指定瑕疵度为3,即无需要进行判断,直接返回0
- 假若输入字符中非元音个数等于指定瑕疵度,那么直接返回该字符串长度即可
- 除上述可能,即指定瑕疵度小于字符本身含有的非元音个数,进行思路3的判断
- 考虑左右各一个指针left,right,和瑕疵度最大字符长度length,因为题中是判断元音字符含瑕疵度的长度最大值。所以在处理时,考虑左右是否为元音字符。
4.当左指针和右指针不重叠时,判断是否左右都元音,若是则加入res空列表中,判断左前加一是否为元音,假若是,那么右后移一位,假若不是,左前移一位;
5.将所有前后都是元音字符的字符串都添加在res列表中,再去判断res中每一位元素的瑕疵度长度,假若瑕疵度长度和输入数量一致,则更新下length,直至遍历完全
代码如下
def longestflow1(strs: str, num: int) -> int:
vowel_string = "aeiouAEIOU"
# 判断输入字符中瑕疵度数量
target = [1 for i in strs if i not in vowel_string]
left, right, length = 0, len(strs) - 1, 0
res = []
# 用来判断res中字符串的瑕疵度长度
def flaw_cons(string):
cons = 0
for i in string:
if i not in vowel_string:
cons += 1
return cons
# 如果字符串中瑕疵度数量小于输入的瑕疵度长度,直接返回0
if len(target) < num:
return 0
# 如果字符串总瑕疵度数量等于输入的瑕疵度长度,直接返回该字符串长度,此时其长度就是含指定非元音字符串的字符最大长度
if len(target) == num:
return len(strs)
if strs.startswith(tuple(vowel_string)) and strs.endswith(tuple(vowel_string)):
while left <= right:
if strs[left].startswith(tuple(vowel_string)) and strs[right].endswith(tuple(vowel_string)):
res.append(strs[left:right+1])
if strs[left+1].startswith(tuple(vowel_string)):
right -= 1
else:
left += 1
elif strs[left].startswith(tuple(vowel_string)) and not strs[right].endswith(tuple(vowel_string)):
right -= 1
else:
left += 1
# 此处一直在迭代更新最大字符长度
for i in range(len(res)):
if flaw_cons(res[i]) == num:
length = max(length, len(res[i]))
return length
else:
return 0
问题: 假若是askhshi,输入数量是1,应返回2,但是我这没法处理,暂无处理思路