题目来自于博主算法大师的专栏:最新华为OD机试C卷+AB卷+OJ(C++JavaJSPy) https://blog.csdn.net/banxia_frontend/category_12225173.html
题目
给定一个字符串 只包含字母和数字
按要求找出字符串中的最长连续子串的长度
字符串本身是其最长的子串
子串要求
- 只包含一个字母(a~z A~Z),其余必须是数字
- 字母可以在子串中的任意位置
- 如果找不到满足要求的子串, 比如说,全是字母或数字则返回-1
输入
字符串只包含字母和数字
输出
子串的长度
示例一
输入
abC124ACb
输出
4
说明
满足条件的最长子串是C124
或者124A
长度都是4
示例二
输入
a5
输出
2
说明
自身就是满足条件的子串长度为2
示例三
输入
aBB9
输出
2
说明
说明满足条件的子串为B9
示例四
输入
abcdef
输出
-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;
}
总结:
这段代码是用来寻找一个字符串中最长连续子串的长度,其中子串要求除了一个字母外,其余字符全为数字。以下是代码详细解释:
-
check
函数:- 输入:一个字符数组
str
- 功能:检查输入的字符串是否满足条件(即只有一个字母且其他字符都是数字)
- 实现方法:
- 创建一个与原字符串等长的临时字符数组
replace
用于存储非数字字符 - 遍历原字符串,当遇到非数字字符时,将其存入
replace
数组,并更新索引index
- 在遍历结束后,给
replace
数组添加终止符\0
- 判断
replace
数组的长度是否不等于原字符串长度 且 小于等于1,若是,则返回 true,表示满足题目要求;否则返回 false。
- 创建一个与原字符串等长的临时字符数组
- 输入:一个字符数组
-
func
函数:- 输入:一个字符数组
str
- 功能:找出字符串中最长符合题意的连续子串的长度
- 实现方法:
- 初始化左右指针
left
和right
分别指向字符串的起始位置 - 使用一个变量
maxLen
存储最长连续子串的长度,初始值为 -1 - 当左指针未达到字符串末尾且右指针未越界时,进行以下操作:
- 先移动右指针
right
,扩大子串范围 - 从原字符串中复制出以
left
开始、长度为 (right
-left
) 的子串到subStr
中 - 调用
check
函数检查subStr
是否满足题目要求 - 若满足要求,则更新
maxLen
为当前子串长度与之前记录的最大长度之间的较大值 - 若不满足要求,则移动左指针
left
,缩小子串范围
- 先移动右指针
- 输出最大连续子串长度
maxLen
- 初始化左右指针
- 输入:一个字符数组
-
main
函数:- 读取一行输入(最多999个字符)存入字符数组
str
中 - 去掉可能存在的换行符,确保字符串以
\0
结束 - 调用
func
函数处理输入字符串并输出最长连续子串的长度
- 读取一行输入(最多999个字符)存入字符数组
总之,这个程序的主要目的是找到一个字符串中最长的连续子串,该子串包含一个和若干个数字。