题目
题目描述:
相对开音节构成的结构为辅音+元音(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实现翻转
判断翻转后的字符串有几个相对开音节子串即可,相对开音节匹配的正则为:[^aeiou][aeiou][^aeiour]e。但是注意,还应该有个条件就是,字符是由小写字母构成的,即!eke不满足相对开音节的规则。所以在判断相对开音节之前,还应该根据正则[a-z]+判断其是否全部由小写字母组成
题解
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),查看当前专栏更新的所有题目。
说明
本专栏所有文章均为原创,欢迎转载,请注明文章出处:https://blog.csdn.net/qq_31076523/article/details/134176793。百度和各类采集站皆不可信,搜索请谨慎鉴别。技术类文章一般都有时效性,本人习惯不定期对自己的博文进行修正和更新,因此请访问出处以查看本文的最新版本。
346

被折叠的 条评论
为什么被折叠?



