java实现字符串相对开音节类型字母串统计

该篇文章详细描述了如何使用Java编程语言,通过暴力方法计算给定字符串中,经过单词反转后含有相对开音节(辅音+元音+辅音/r/除外+e)结构的子串数量。
摘要由CSDN通过智能技术生成

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;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值