题目描述
相对开音节构成的结构为辅音+元音(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,
因为!ekam含有非英文字母,所以未反转,
其中 cake和keke 为相对开音节子串 返回2。
思路分析
- 相对开音节构成的结构为辅音+元音(aeiou)+辅音(r除外)+e,共计4个字母。
- 若单词中包含如数字等其他非字母时不进行反转。.
- 连续子串中部分字符可以重复。
- 字母只考虑小写。
参考代码
注:题目网上找的,参考代码是练习用,仅供参考,并不保证用例通过率。
import java.util.Scanner;
/**
* 题目47 开元音统计
*/
public class Test0047 {
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);
}
}