【华为OD题库-072】相对开音节-java

题目

题目描述:
相对开音节构成的结构为辅音+元音(aeiou)+辅音(r除外)+e
常见的单词有bike cake
给定一个字符串,以空格为分隔符反转每个单词的字母
若单词中包含如数字等其他非字母时不进行反转
反转后计算其中含有相对开音节结构的子串个数(连续子串中部分字符可以重复)
输入描述
字符串以空格分割的多个单词长度<10000
字母只考虑小写
输出描述
含有相对开音节结构的子串个数
示例1:
输入
ekam a ekac
输出
2
说明:
反转后为make a cake其中make和cake为相对开音节子串,返回2
示例2:
输入
!ekam a ekekac
输出
2
说明
反转后为!ekam a cakeke
因为lekam含有非英文字母,所以未反转,其中cake和keke为相对开音节子串,返回2

思路

正则匹配题目。
利用StringBuild的reverse实现翻转
判断翻转后的字符串有几个相对开音节子串即可

题解

package hwod;

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

public class OpenSyllable {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String str = sc.nextLine();
        System.out.println(openSyllable(str));
    }

    private static int openSyllable(String str) {
        String[] arrs = str.split(" ");
        int cnt = 0;
        for (int i = 0; i < arrs.length; i++) {
            arrs[i] = reverseStr(arrs[i]);
            int k = 0;
            while (k + 3 < arrs[i].length()) {
                if (isMatch(arrs[i].substring(k, k + 4))) cnt++;
                k++;
            }
        }
        return cnt;
    }

    private static boolean isMatch(String str) {
        String p1 = "[a-z]+";
        String p2 = "[^aeiou][aeiou][^aeiour]e";
        return str.matches(p1) && str.matches(p2);
    }

    private static String reverseStr(String str) {
        if(!str.matches("[a-z]+")) return str;
        StringBuilder sb = new StringBuilder(str);
        return sb.reverse().toString();

    }
}

推荐

如果你对本系列的其他题目感兴趣,可以参考华为OD机试真题及题解(JAVA),查看当前专栏更新的所有题目。

你可能感兴趣的:(华为OD题库JAVA题解,华为od,java,正则表达式)