最长连续子串

简介: 最长连续子串

题目

给定一个字符串 只包含字母和数字

按要求找出字符串中的最长连续子串的长度

字符串本身是其最长的子串


子串要求

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


输入

字符串只包含字母和数字

输出

子串的长度

示例一

输入

abC124ACb

输出

4

说明

满足条件的最长子串C124或者124A

长度都是4

示例二

输入

a5

输出

2

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

示例三

输入

aBB9

输出

2

说明

说明满足条件的子串为B9

示例四

输入

abcdef

输出

-1

说明

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

代码

// 最长连续子串
// 子串:除了一个字母其他全是数字
#include <stdio.h>
#include <string.h>

int check(char str[]) {
    char replace[strlen(str)];
    int index = 0;
    for (int i = 0; i < strlen(str); i++) {
        if (str[i] >= '0' && str[i] <= '9') {
            continue;
        } else {
            replace[index++] = str[i]; // replace[]只有字母
            // printf("%c\n", str[i]);
        }
    }
    replace[index] = '\0'; // 0—index-1,之后加终止符
    return strlen(replace) != strlen(str) && strlen(replace) <= 1;
    // 不全是字母 并且 字母长度为0或1,例:aa4 4aa a4a b9888
    //之所以这里设置<= 1,是因为当判断类似111a的时候,遇到前面的1,11,111都应该使right++
    // 举例:111a ,1   strlen(replace)=0, 11 strlen(replace)=0,
    //            111  strlen(replace)=0; 111a  strlen(replace)=1  最终right -
    //            left=4
}

void func(char str[]) {
    int left = 0;
    int right = 1;
    int maxLen = -1;
    // 检查整个字符串是否全部由数字组成
    for (int i = 0; i < strlen(str); i++) {
        if (str[i] < '0' || str[i] > '9') { // 遇到非数字字符则跳出循环
            break;
        }
        if (i == strlen(str) - 1) { // 若已遍历完字符串且均为数字,则直接输出-1
            printf("%d\n", -1);
            return;
        }
    }

    while (left < strlen(str) && right < strlen(str)) {
        right++; // 右边指针先走
        char subStr[right - left + 1];
        // 从str中复制长度为(right -
        // left)的部分,到subStr中。(从str的left位置开始复制)
        strncpy(subStr, &str[left], right - left);
        subStr[right - left] = '\0';
        if (check(subStr)) {
            maxLen = (right - left) > maxLen ? (right - left) : maxLen;
        } else {
            left++;
        }
    }
    printf("%d\n", maxLen);
}

int main() {
    char str[1000];
    fgets(str, sizeof(str), stdin);
    str[strlen(str) - 1] =
        '\0'; // 将 str 数组中原本可能存在的换行符替换为字符串终止符 \0
    func(str);
    return 0;
}

总结:

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

check 函数:


1.输入:一个字符数组 str

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


2.func 函数:


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


3.main 函数:


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

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

相关文章
|
资源调度 算法 JavaScript
Python基础专题 - 超级详细的 Random(随机)原理解析与编程实践
Python基础专题 - 超级详细的 Random(随机)原理解析与编程实践
1468 0
|
缓存 测试技术 Android开发
深入探究Android中的自定义View绘制优化策略
【4月更文挑战第8天】 在Android开发实践中,自定义View的绘制性能至关重要,尤其是当涉及到复杂图形和动画时。本文将探讨几种提高自定义View绘制效率的策略,包括合理使用硬件加速、减少不必要的绘制区域以及利用缓存机制等。这些方法不仅能改善用户体验,还能提升应用的整体性能表现。通过实例分析和性能测试结果,我们将展示如何有效地实现这些优化措施,并为开发者提供实用的技术指南。
|
机器学习/深度学习 算法 物联网
LoRA+:优化模型微调的新方案
【2月更文挑战第17天】LoRA+:优化模型微调的新方案
743 1
LoRA+:优化模型微调的新方案
|
存储 NoSQL Redis
redis zset底层数据结构
zset底层存储结构  zset底层的存储结构包括ziplist或skiplist,在同时满足以下两个条件的时候使用ziplist,其他时候使用skiplist,两个条件如下: 有序集合保存的元素数量小于128个 有序集合保存的所有元素的长度小于64字节  当ziplist作为zset的底层存储结构时候,每个集合元素使用两个紧挨在一起的压缩列表节点来保存,第一个节点保存元素的成员,第二个元素保存元素的分值。
15624 1
|
算法 C语言
【数据结构与算法 经典例题】使用队列实现栈(图文详解)
【数据结构与算法 经典例题】使用队列实现栈(图文详解)
|
Web App开发 JavaScript 前端开发
重复创建多个定时器,是否会导致内存溢出
重复创建多个定时器,是否会导致内存溢出
|
缓存 算法 图形学
帧同步总结
帧同步总结
463 0
|
前端开发 JavaScript
Webpack打包流程
Webpack 是一款非常流行的打包工具,它的主要作用是将项目中的各个模块打包成静态资源,以便于在浏览器中加载和运行。Webpack 的打包流程可以分为以下几个步骤:
|
算法 网络协议 安全
最全的二叉树算法总结,30道题搞定大厂算法面试(一)
最全的二叉树算法总结,30道题搞定大厂算法面试
|
SQL Java 测试技术
变异测试
变异测试
680 1
变异测试