当前位置:   article > 正文

求满足条件的最长子串的长度 【滑动窗口】_只包含 1 个字母(a~z, a~z),其余必须是数字

只包含 1 个字母(a~z, a~z),其余必须是数字

题目来自于博主算法大师的专栏:最新华为OD机试C卷+AB卷+OJ(C++JavaJSPy) https://blog.csdn.net/banxia_frontend/category_12225173.html

题目

给定一个字符串 只包含字母和数字
按要求找出字符串中的最长连续子串的长度
字符串本身是其最长的子串
子串要求

  • 只包含一个字母(a~z A~Z),其余必须是数字
  • 字母可以在子串中的任意位置
  • 如果找不到满足要求的子串, 比如说,全是字母或数字则返回-1

输入

字符串只包含字母和数字

输出

子串的长度

示例一

输入

abC124ACb
  • 1

输出

4
  • 1

说明
满足条件的最长子串是C124或者124A
长度都是4

示例二

输入

a5
  • 1

输出

2
  • 1

说明
自身就是满足条件的子串长度为2

示例三

输入

aBB9
  • 1

输出

2
  • 1

说明
说明满足条件的子串为B9

示例四

输入

abcdef
  • 1

输出

-1
  • 1

说明
没有满足要求的子串,返回-1

代码

#include <ctype.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int manzu(char *str) {
    int len = strlen(str);
    int numa = 0, num1 = 0;
    for (int i = 0; i < len; i++) {
        if (isalpha(str[i])) {
            numa++;
        }
        if (isdigit(str[i])) {
            num1++;
        }
    }
    // 只包含1个字母(a~z, A~Z),其余必须是数字;
    if (numa == 1 && num1 > 0 && num1 == len - 1) {
        return 1;
    }
    return 0;
}
int main() {
    char line[100];
    scanf("%s", line);
    int length = strlen(line);
    int max = 0;
    int left = 0;
    for (int right = 0; right < length; right++) {
        if (left < right) {
            char tmp[100];
            strncpy(tmp, line + left, right - left + 1);
            tmp[right - left + 1] = '\0';
            if (manzu(tmp)) {
                max = fmax(max, right - left + 1);
            } else {
                left++;
            }
        }
    }

    if (max == 0) {
        printf("-1");
        return 0;
    }
    printf("%d", max);
    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48

总结:

这段代码是用来寻找一个字符串中最长连续子串的长度,其中子串要求除了一个字母外,其余字符全为数字。以下是代码详细解释:

  1. check 函数:

    • 输入:一个字符数组 str
    • 功能:检查输入的字符串是否满足条件(即只有一个字母且其他字符都是数字)
    • 实现方法:
      • 创建一个与原字符串等长的临时字符数组 replace 用于存储非数字字符
      • 遍历原字符串,当遇到非数字字符时,将其存入 replace 数组,并更新索引 index
      • 在遍历结束后,给 replace 数组添加终止符 \0
      • 判断replace 数组的长度是否不等于原字符串长度 且 小于等于1,若是,则返回 true,表示满足题目要求;否则返回 false。
  2. func 函数:

    • 输入:一个字符数组 str
    • 功能:找出字符串中最长符合题意的连续子串的长度
    • 实现方法:
      • 初始化左右指针 leftright 分别指向字符串的起始位置
      • 使用一个变量 maxLen 存储最长连续子串的长度,初始值为 -1
      • 当左指针未达到字符串末尾且右指针未越界时,进行以下操作:
        • 先移动右指针 right,扩大子串范围
        • 从原字符串中复制出以 left 开始、长度为 (right - left) 的子串到 subStr
        • 调用 check 函数检查 subStr 是否满足题目要求
        • 若满足要求,则更新 maxLen 为当前子串长度与之前记录的最大长度之间的较大值
        • 若不满足要求,则移动左指针 left,缩小子串范围
      • 输出最大连续子串长度 maxLen
  3. main 函数:

    • 读取一行输入(最多999个字符)存入字符数组 str
    • 去掉可能存在的换行符,确保字符串以 \0 结束
    • 调用 func 函数处理输入字符串并输出最长连续子串的长度

总之,这个程序的主要目的是找到一个字符串中最长的连续子串,该子串包含一个和若干个数字。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/466091
推荐阅读
相关标签
  

闽ICP备14008679号