华为OD机试 - 最长的指定瑕疵度的元音子串 - 正则表达式(Java 2023 B卷 200分)

在这里插入图片描述

目录

    • 专栏导读
    • 一、题目描述
    • 二、输入描述
    • 三、输出描述
    • 四、解题思路
    • 五、Java算法源码
    • 六、效果展示
      • 1、输入
      • 2、输出
      • 3、说明

华为OD机试 2023B卷题库疯狂收录中,刷题点这里

专栏导读

本专栏收录于《华为OD机试(JAVA)真题(A卷+B卷)》。

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。

一、题目描述

开头和结尾都是元音字母(aeiouAEIOU)的字符串为元音字符串,其中混杂的非元音字母数量为其瑕疵度。

比如:

  • “a” 、 “aa”是元音字符串,其瑕疵度都为0
  • “aiur”不是元音字符串(结尾不是元音字符)
  • “abira”是元音字符串,其瑕疵度为2

给定一个字符串,请找出指定瑕疵度的最长元音字符子串,并输出其长度,如果找不到满足条件的元音字符子串,输出0。

子串:字符串中任意个连续的字符组成的子序列称为该字符串的子串。

二、输入描述

首行输入是一个整数,表示预期的瑕疵度flaw,取值范围[0, 65535]。

接下来一行是一个仅由字符a-z和A-Z组成的字符串,字符串长度(0, 65535]。

三、输出描述

输出为一个整数,代表满足条件的元音字符最长子串的长度。

输入 输出 说明
0
asdbuiodevauufgh
3 uio为瑕疵度为0的最长子串,故长度为3 当然auu也是
2
aeueo
3 0

四、解题思路

核心思想:

开头是元音,结尾是元音,中间出现的非元音字符是瑕疵度

这道题的关键是正则表达式的合理使用。

五、Java算法源码

package com.guor.od;

import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class OdTest01 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        // 预期的瑕疵度flaw
        int flaw = Integer.valueOf(scanner.nextLine());
        // 仅由字符a-z和A-Z组成的字符串
        String str = scanner.nextLine();
        // 开头是元音 结尾是元音 中间出现的非元音字符是瑕疵度
        String regex = "";
        if (flaw == 0) {
            regex = "[aeiouAEIOU]{1,}";
        } else {
            regex = "[aeiouAEIOU]{1}";
            for (int i = 0; i < flaw; i++) {
                regex += "[^aeiouAEIOU]{1}[aeiouAEIOU]*";
            }
            regex += "[aeiouAEIOU]{1}";
        }

        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(str);
        // 符合要求的字符串的最大长度
        int max = 0;
        // 寻找符合要求的字符串
        while (matcher.find()) {
            // 符合要求的字符串
            System.out.println(str.substring(matcher.start(), matcher.end()));
            // 获取符合要求的字符串的最大长度
            if (matcher.end() - matcher.start() > max) {
                max = matcher.end() - matcher.start();
            }
            StringBuilder sb = new StringBuilder(str);
            sb.setCharAt(matcher.start(), '_');
            str = sb.toString();
            matcher = pattern.matcher(str);
        }
        System.out.println("长度:" + max);
    }
}

六、效果展示

1、输入

2
nezhastudyjavaveryhard

2、输出

5

3、说明

掌握核心编程思想,让你的编程不再烦恼。

开头是元音,结尾是元音,中间出现的非元音字符是瑕疵度。

符合要求的子串有:

  • ezha
  • astu
  • avave

最长的是avave,长度5。
华为OD机试 - 最长的指定瑕疵度的元音子串 - 正则表达式(Java 2023 B卷 200分)_第1张图片


下一篇:华为OD机试 - 荒岛求生 - 栈Stack(Java 2023 B卷 100分)

本文收录于,华为OD机试(JAVA)真题(A卷+B卷)

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。

在这里插入图片描述

你可能感兴趣的:(搬砖工逆袭Java架构师,华为od,正则表达式,java,送书,学习方法)