给定一个字符串,只包含字母和数字,按要求找出字符串中的最长(连续)子串的长度,字符串本身是其最长的子串,子串要求:
1、只包含1个字母(a~z, A~Z),其余必须是数字;
2、字母可以在子串中的任意位置;
如果找不到满足要求的子串,如全是字母或全是数字,则返回-1。
输入描述:
字符串(只包含字母和数字)
输出描述:
子串的长度
示例1:
输入
abC124ACb
输出
4
作者:d17c2a49b064
链接:https://www.jianshu.com/p/edc1efd18a67
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
一、问题分析
首先读题,仔细看描述中的内容,发现需求是
1.给定一个字符串,只包含字母和数字
2.按要求找出字符串中的最长(连续)子串的长度,字符串本身是其最长的子串,
3.子串要求:(1)只包含1个字母(a~z,A~Z),其余必须是数字
(2)字母可以在子串中的任何位置
4.如果找不到满足要求的子串,如全是字母或全是数字,则返回-1.
5.输入描述:字符串(只包含字母和数字)
6.输出描述:子串的长度
二、解题思路
1.设定一个布尔类型的found为false,如果找到了变成true,没找到输出-1
2.设定一个布尔类型的isletter为false,遇到字母变成true,遇到数字,构成符合要求的字符串,(字符串长度等于数字的数量加上1),最后变成false,(如果str[i]是字母那么变成true)
3.如果遇到数字,统计数字数量,判定数字前后是否有字母,如果有,则为有效子串,判断长度和count的大小,count等于比较大的那个
4.输出结果
三、具体步骤
使用的语言是C
cpp
#include <ctype.h>
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
int main() {
char str[1000];
scanf("%s", str);
int len = strlen(str);
bool isletter = false;
int count = 0;
bool found = false;
for(int i = 0; i < len; i++) {
if(isalpha(str[i])) isletter = true;
if(isdigit(str[i])) {
int temp = 0;
while(i < len && isdigit(str[i])) {
i++;
temp++;
}
if((isletter || isalpha(str[i])) && temp > count) {
found = true;
count = temp + 1;
}
isletter = false;
if(isalpha(str[i])) isletter = true;
}
}
if(found) printf("%d\n", count);
else printf("-1\n");
return 0;
}