题目
给定一个字符串 只包含字母和数字
按要求找出字符串中的最长连续子串的长度
字符串本身是其最长的子串
子串要求
- 只包含一个字母(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 函数处理输入字符串并输出最长连续子串的长度
总之,这个程序的主要目的是找到一个字符串中最长的连续子串,该子串包含一个和若干个数字。