java实现字符串相对开音节类型字母串统计
描述
相对开音节构成的结构为:辅音+元音(aeiou)+ 辅音(r除外)+ e。常见的单词有bike、cake等。
给定一个字符串,以空格为分隔符,反转每个单词中的字母,若单词中包含如数字等其他非字母时不进行反转。
反转后计算其中含有相对开音节结构的子串个数(连续的子串中部分字符可以重复)。
输入描述:
字符串,以空格分割的多个单词,字符串长度<10000,字母只考虑小写。
输出描述:
含有相对开音节结构的子串个数,注:个数<10000。
用例:
输入:
!lekam a ekekac
输出:
2
java实现(暴力实现)
package com.des.data.test;
import java.util.ArrayList;
import java.util.List;
public class RelativeOpenSyllable {
public static void main(String[] args) {
String str = "!lekam a ekekac";
String str2 = "cakeke";
System.out.println(solution(str));
}
public static int solution(String str) {
String[] strs = str.split(" ");
int sum = 0;
List<String> listl = new ArrayList<>();
StringBuffer strb = new StringBuffer();
for (int i = 0; i < strs.length; i++) {
String strl = strs[i];
if (isCase(strl)) {
listl.add(strl);
if (i == strs.length - 1 || !isCase(strs[i + 1])) {
for (int j = 0; j < listl.size(); j++) {
String word = listl.get(j);
String wordN = "";
for (int k = word.length() - 1; k >= 0; k--) {
wordN += new String(new char[]{word.charAt(k)});
}
sum += isk(wordN);
strb.append(listl.get(j) + " ");
}
listl = new ArrayList<>();
}
continue;
}
strb.append(strl + " ");
sum += isk(strl);
}
System.out.println(strb);
return sum;
}
private static int isk(String str) {
int sum = 0;
for (int i = 0; i < str.length(); i++) {
char c = str.charAt(i);
if (!Character.isLowerCase(c)) {
continue;
}
if (i + 1 > str.length() - 1 || str.length() - 1 < i + 2 || str.length() - 1 < i + 3) {
break;
}
char cd = str.charAt(i + 1);
if (!Character.isLowerCase(cd)) {
i = i + 1;
continue;
}
char ce = str.charAt(i + 2);
if (!Character.isLowerCase(ce)) {
i = i + 2;
continue;
}
char cf = str.charAt(i + 3);
if (!Character.isLowerCase(cf)) {
i = i + 3;
continue;
}
if (!isy(c) && isy(cd) && (!isy(ce) && ce != 'r') && cf == 'e') {
sum++;
}
}
return sum;
}
private static boolean isy(char c) {
if (c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u') {
return true;
}
return false;
}
private static boolean isCase(String str) {
for (int i = 0; i < str.length(); i++) {
char c = str.charAt(i);
if (!(Character.isUpperCase(c) || Character.isLowerCase(c))) {
return false;
}
}
return true;
}
}