一、题目描述
相对开音节构成的结构为辅音+元音(aeiou)+辅音(r除外)+e,常见的单词有bike cake,给定一个字符串,以空格为分隔符。
反转每个单词的字母,若单词中包含如数字等其他非字母时不进行反转,反转后计算其中含有相对开音节结构的子串个数(连续子串中部分字符可以重复)。
二、输入描述
字符串 以空格分割的多个单词,长度<10000 字母只考虑小写。
- 相对开音节构成的结构为辅音+元音(aeiou)+辅音(r除外)+e,共计4个字母;
- 若单词中包含如数字等其他非字母时不进行反转;
- 连续子串中部分字符可以重复;
- 字母只考虑小写;
三、输出描述
含有相对开音节结构的子串个数。
四、Java算法源码
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String[] words = scanner.nextLine().split(" ");
int count = 0;
for (int i = 0; i < words.length; i++) {
String word = words[i];
// 长度小于4的单词不用考虑
if (word.length() < 4) {
continue;
}
// 只考虑小写字母
if (!word.matches("[a-z]+")) {
continue;
}
// 如果值包含字母,不含数字和特殊字符,进行翻转
StringBuilder builder = new StringBuilder();
for (int j = 0; j < word.length(); j++) {
builder.append(word.charAt(j));
}
word = builder.reverse().toString();
// 反转后计算其中含有相对开音节结构的子串个数
// 相对开音节构成的结构为辅音+元音(aeiou)+辅音(r除外)+e
// 连续子串中部分字符可以重复
String subWord;
for (int j = 0; j < word.length(); j++) {
if (j + 4 > word.length()) {
break;
}
subWord = word.substring(j, j + 4);
// 第1个为辅音,非元音
if (subWord.substring(0, 1).matches("[aeiou]")) {
continue;
}
// 第2个为元音
if (!subWord.substring(1, 2).matches("[aeiou]")) {
continue;
}
// 第3个为辅音,r也除外
if (subWord.substring(2, 3).matches("[aeiour]")) {
continue;
}
// 第4个是e
if (!subWord.substring(3, 4).matches("[e]")) {
continue;
}
count++;
}
}
System.out.println(count);
}
五、效果展示
- 输入:ekam a ekac
- 输出:2
说明:反转后为 make a cake 其中make和cake为相对开音节子串, 返回2。
- 输入:!ekam a ekekac
- 输出:2
说明:
反转后为 !ekam a cakeke,
因为!ekam含有非英文字母,所以未反转,
其中 cake和keke 为相对开音节子串 返回2。
🏆本文收录于,华为OD机试2023(Java)
本专栏包含了最新最全的2023年华为OD机试真题,有详细的分析和Java解答。已帮助1000+同学顺利通过OD机考。专栏会持续更新,每天在线答疑。