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

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

题目

开头和结尾都是元音字母(aeiouAEIOU)的字符串为元音字符串,其中混杂的非元音字母数量为其瑕疵度。比如:


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

“aiur”不是元音字符串(结尾不是元音字符)

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

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

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


输入描述

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

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


输出描述

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

示例一

输入

0
asdbuiodevauufgh

输出

3

说明

满足条件的最长元音字符子串有两个,分别为 uioauu ,长度为 3。

示例二

输入

2
aeueo

输出

0

说明

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

示例三

输入

2
aabeebuu

输出

5

说明

满足条件的最长元音字符子串有两个,分别为aabeeeebuu,长度为 5

代码

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

#include <stdio.h>
#include <string.h>

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);
            // string + i: 表示源字符串 string 从第 i+1个字符开始的位置。
            // 在C语言中,字符串是一个字符数组,通过加法操作符可以访问数组内的特定位置。这里string + i 实际上是指向 string[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,并最终输出满足条件的最长元音子串的长度。

补充

  • scanf("%d\n", &flaw); 这其中加&的作用是什么?

&flaw:这里的&是一个取地址运算符,它获取变量flaw的内存地址。因为scanf需要知道应该将读取到的整数值存储在哪里,所以它需要的是目标变量的地址而不是其值。通过传递&flaw,scanf就能把读取到的整数写入到flaw变量所在的内存位置,从而实现对flaw变量的赋值操作。

当你省略了取地址符&时,你传递给scanf的是变量flaw的值(假设为整数类型),而不是它的地址。

  • strncpy(substring, string + i, j - i); string + i: 表示源字符串 string 从第 i+1 个字符开始的位置。在C语言中,字符串是一个字符数组,通过加法操作符可以访问数组内的特定位置。这里 string + i 实际上是指向 string[i] 后面那个字符的指针。(在C语言中,数组名可以被视为指向数组首元素(即第一个字符)的指针。)


相关文章
|
6月前
|
存储
【题型总结】寻找满足字符出现奇数次/偶数次的子串个数或者子串最长长度
【题型总结】寻找满足字符出现奇数次/偶数次的子串个数或者子串最长长度
114 0
|
5月前
|
算法
【经典LeetCode算法题目专栏分类】【第8期】滑动窗口:最小覆盖子串、字符串排列、找所有字母异位词、 最长无重复子串
【经典LeetCode算法题目专栏分类】【第8期】滑动窗口:最小覆盖子串、字符串排列、找所有字母异位词、 最长无重复子串
|
6月前
【每日一题Day233】LC1170比较字符串最小字母出现频次 | 前缀和
【每日一题Day233】LC1170比较字符串最小字母出现频次 | 前缀和
38 0
|
6月前
|
存储 算法 程序员
【算法训练-字符串 一】【子串问题】最长无重复子串、最长回文子串、最长公共前缀
【算法训练-字符串 一】【子串问题】最长无重复子串、最长回文子串、最长公共前缀
68 0
【每日挠头算法题(8)】最后一个单词的长度|重新排列字符串
【每日挠头算法题(8)】最后一个单词的长度|重新排列字符串
|
算法 索引
【算法挨揍日记】day08——30. 串联所有单词的子串、76. 最小覆盖子串
给定一个字符串 s 和一个字符串数组 words。 words 中所有字符串 长度相同。 s 中的 串联子串 是指一个包含 words 中所有字符串以任意顺序排列连接起来的子串。 例如,如果 words = [&quot;ab&quot;,&quot;cd&quot;,&quot;ef&quot;], 那么 &quot;abcdef&quot;, &quot;abefcd&quot;,&quot;cdabef&quot;, &quot;cdefab&quot;,&quot;efabcd&quot;, 和 &quot;efcdab&quot; 都是串联子串。 &quot;acdbef&quot; 不是串联子串,因为他不是任何 words 排列的连接。
387 0
|
算法
【算法挨揍日记】day05——209. 长度最小的子数组、3. 无重复字符的最长子串
题目描述: 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其总和大于等于 target 的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。
358 0
|
机器学习/深度学习 搜索推荐 开发工具
对数据进行模糊匹配搜索(动态规划、最长公共子串、最长公共子序列)
倘若要在一堆数据中对一个关键词进行匹配搜索,传统做法是把数据拆分开,然后遍历他们,看看是否包含这个关键词,对于 “fin” 和 “finish” 这样存在包含关系的单词来说是没问题的,但是对于 “fish” 和 “finish” 这样并不存在包含关系的单词就失效了,这时候期望计算出两个单词的相似性,比如 “fish” 和 “finish” 都包含 “ish”,“ish” 的长度是 3,我们可以理解相似性为 3。目前主流做法是通过最长公共子串来寻找两个或多个已知字符串最长的子串。
134 0
对数据进行模糊匹配搜索(动态规划、最长公共子串、最长公共子序列)
|
算法 测试技术
算法强化每日一题--字符串中找出连续最长的数字串
算法强化每日一题--字符串中找出连续最长的数字串
用C++实现字符的逆转
用C++实现字符的逆转