最长的指定瑕疵度的元音子串

开头和结尾都是元音字母( a e i o u A E I O U aeiouAEIOUaeiouAEIOU)的字符串为元音字符串,其中混杂的非元音字母数量为其瑕疵度。比如:

“ a ” “a”“a” 、 “ a a ” “aa”“aa”是元音字符串,其瑕疵度都为 0

“ a i u r ” “aiur”“aiur”不是元音字符串(结尾不是元音字符)

“ a b i r a ” “abira”“abira”是元音字符串,其瑕疵度为 2

给定一个字符串,请找出指定瑕疵度的最长元音字符子串,并输出其长度,如果找不到满足条件的元音字符子串,输出 0。

子串:字符串中任意个连续的字符组成的子序列称为该字符串的子串。

输入描述

首行输入是一个整数,表示预期的瑕疵度 f l a w flawflaw,取值范围 [ 0 , 65535 ] [0, 65535][0,65535]。

接下来一行是一个仅由字符 a − z a-za−z 和 A − Z A-ZA−Z 组成的字符串,字符串长度 ( 0 , 65535 ] (0, 65535](0,65535]。

输出描述

输出为一个整数,代表满足条件的元音字符子串的长度。

示例一

输入

0
asdbuiodevauufgh

输出

3

说明
满足条件的最长元音字符子串有两个,分别为 u i o uiouio 和 a u u auuauu ,长度为 3。

示例二

输入

2
aeueo

输出

0

说明
没有满足条件的元音字符子串,输出 0

示例三

输入

aabeebuu
2

输出

5

说明
满足条件的最长元音字符子串有两个,分别为 a a b e e aabeeaabee 和 e e b u u eebuueebuu,长度为 5

// https://dream.blog.csdn.net/article/details/134393410
// 最长的指定瑕疵度的元音子串

#include 
#include 

char yuan[] = "aeiouAEIOU";

int isYuan(char *string) {
    int n = 0; // 瑕疵度
    int len = strlen(string);

    if (strchr(yuan, string[0]) != NULL &&
        strchr(yuan, string[len - 1]) != NULL) {
        for (int i = 0; i < len; i++) {
            // strchr 在给定的字符串yuan中查找指定字符string[i]首次出现的位置
            if (strchr(yuan, string[i]) == NULL) { // 如果没有出现
                n++;                               // 瑕疵度++
            }
        }
    } else {
        n = -1;
    }

    return n;
}

int trans(char *string, int n) {
    int len = 0;
    int length = strlen(string);

    for (int i = 0; i < length; i++) {
        for (int j = i + 1; j <= length; j++) {
            char substring[length + 1];
            strncpy(substring, string + i, j - i);
            substring[j - i] = '\0';

            int d = isYuan(substring);

            if (d == n) {
                len = len > strlen(substring) ? len : strlen(substring);
            }
        }
    }

    return len;
}

int main() {
    int flaw;
    scanf("%d\n", &flaw);

    char inputString[65536];
    fgets(inputString, sizeof(inputString), stdin);

    int result = trans(inputString, flaw);
    printf("%d\n", result);

    return 0;
}

总结:

这段代码是用来解决题目中描述的问题的,即寻找给定字符串中最长的瑕疵度为指定值的元音字符串子串,并输出其长度。以下是代码的逐行解释:

  1. 包含头文件stdio.h和string.h,提供输入输出、字符串处理等相关函数。

  2. 定义一个包含所有元音字符的数组 yuan

  3. 编写函数 isYuan(char *string),该函数接收一个字符串参数,用于判断该字符串是否为元音字符串以及计算其瑕疵度。

    • 首先获取字符串长度 len。
    • 判断字符串首尾字符是否为元音字符,若是,则继续遍历整个字符串,统计非元音字符数量(即瑕疵度 n);否则,返回-1表示该字符串不是有效的元音字符串。
  4. 编写函数 trans(char *string, int n),该函数接收一个字符串参数和一个整数参数(预期的瑕疵度),目的是在该字符串中查找瑕疵度为 n 的最长元音子串并返回其长度。

    • 获取输入字符串长度 length。
    • 使用两层循环遍历所有可能的子串(从 i 到 j 之间的字符组成子串)。
      • 创建一个临时子串变量 substring 并复制当前子串到其中。
      • 调用 isYuan(substring) 函数检查子串是否为瑕疵度为 n 的元音子串,若是,则更新最长元音子串长度 len。
    • 循环结束后返回最长元音子串长度 len。
  5. 主函数 main():

    • 定义一个示例输入字符串 inputString 和期望瑕疵度变量 flaw
    • 调用 trans(inputString, flaw) 函数找到瑕疵度为 flaw 的最长元音子串的长度,并将结果存储在变量 result 中。
    • 输出结果 result

当运行此程序时,它会读取给定字符串 “asdbuiodevauufgh”,期望瑕疵度为0,并最终输出满足条件的最长元音子串的长度。

你可能感兴趣的:(刷题,c语言,c++,数据结构)