题 目描述
开头和结尾都是元音字母(aeiouAEIOU)的字符串为元音字符串,其中混杂的非元音字母数量为其瑕疵度。比如.
- 1.“a”、“aa"是元音字符串,其瑕疵度都为0
- 2.“aiur"不是元音字符串(结尾不是元音字符)
- 3.“abira”是元音字符串,其瑕疵度为2
给定一个字符串,请找出指定瑕疵度的最长元音字符子串,并输出其长度,如果找不到满足条件的元音字符子串,输出0。
- 子串:字符串中任意个连续的字符组成的子序列称为该字符串的子串。
输入描述
首行输入是一个整数,表示预期的瑕疵度flaw,取值范围[0,65535]。
接下来一行是一个仅由字符a-z和A-Z组成的字符串,字符串长度(0,65535]。
输出描述
输出为一个整数,代表满足条件的元音字符子串的长度。
示例1
输入:
0
asdbuiodevauufgh
输出:3
说明:
满足条件的最长元音字符子串有两个,分别为uio和auu,长度为3.
示例2
输入:
2
aeueo
输出:0
说明:
没有满足条件的元音字符子串,输出0
示例3
输入:1
aabeebuu
输出:5
说明:
满足条件的最长元音字符子串有两个,分别为aabee和eebuu,长度为5
public class 最长的指定瑕疵度的元音子串Main {public static void main(String[] args) {// 定义一个HashSet存储元音字符,用于快速查找char[] chars = "aeiouAEIOU".toCharArray();HashSet<Character> st = new HashSet<>();for (char c: chars){st.add(c);}// 使用Scanner来读取输入Scanner in = new Scanner(System.in); int cnt = in.nextInt(); // 读取预期的瑕疵度StringBuilder sb = new StringBuilder(in.next()); // 读取字符串int n = sb.length(); // 字符串长度sb.insert(0, ' '); // 前面插入空格,使索引从1开始sb.append(' '); // 后面插入空格,使索引到n结束// 创建一个列表存储所有非元音字符的位置List<Integer> v = new ArrayList<>();v.add(0); // 初始化,加入0作为首元素for (int i = 1; i <= n; i++) {// 如果当前字符不是元音,则记录其位置if (!st.contains(sb.charAt(i))) {v.add(i);}}v.add(n+1);int ans = 0; // 初始化答案为0// 遍历非元音字符的位置,找出最长的满足瑕疵度的元音子串for (int p = 1; p + cnt < v.size(); p++) {int pl = v.get(p-1)+1, pr = v.get(p+cnt)-1;if (st.contains(sb.charAt(pl)) && st.contains(sb.charAt(pr))) // 保证两端是元音字符ans = Math.max(ans, pr - pl + 1);}// 输出结果System.out.println(ans);}
}