赞
踩
题目来自于博主算法大师的专栏:最新华为OD机试C卷+AB卷+OJ(C++JavaJSPy) https://blog.csdn.net/banxia_frontend/category_12225173.html
给定一个字符串 只包含字母和数字
按要求找出字符串中的最长连续子串的长度
字符串本身是其最长的子串
子串要求
字符串只包含字母和数字
子串的长度
输入
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
存储最长连续子串的长度,初始值为 -1right
,扩大子串范围left
开始、长度为 (right
- left
) 的子串到 subStr
中check
函数检查 subStr
是否满足题目要求maxLen
为当前子串长度与之前记录的最大长度之间的较大值left
,缩小子串范围maxLen
main
函数:
str
中\0
结束func
函数处理输入字符串并输出最长连续子串的长度总之,这个程序的主要目的是找到一个字符串中最长的连续子串,该子串包含一个和若干个数字。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。