题目描述:
给定一个字符串,只包含字母和数字,按要求找出字符串中的最长(连续)子串的长度,字符串本身是其最长的子串,子串要求:
1、 只包含1个字母(a~z, A~Z),其余必须是数字;
2、 字母可以在子串中的任意位置;
如果找不到满足要求的子串,如全是字母或全是数字,则返回-1。
输入描述:
字符串(只包含字母和数字)
输出描述:
子串的长度
示例1输入输出示例仅供调试,后台判题数据一般不包含示例
输入
abC124ACb
输出
4
说明
满足条件的最长子串是C124或者124A,长度都是4
示例2输入输出示例仅供调试,后台判题数据一般不包含示例
输入
a5
输出
2
说明
字符串自身就是满足条件的子串,长度为2
示例3输入输出示例仅供调试,后台判题数据一般不包含示例
输入
aBB9
输出
2
说明
满足条件的子串为B9,长度为2
示例4输入输出示例仅供调试,后台判题数据一般不包含示例
输入
abcdef
输出
-1
说明
没有满足要求的子串,返回-1
668
+---+
3 | | ++ + +---|
| | | 3 + 6 + | + | +
| + | | + + + | + | +
| + | +---+ + + +++++ + | + | +
| + | + | + +----+ | | + | + | +
| + 3 | + | + + + 2 | | 2 + | + | +
| + | + | + + + | | + | + | +
| +---+ | | | | + ----+ | +---+ | | + | +
| | | | | | + | | | | | | + | +
| 1 | | | 8 | | + 1 | | | 1 | | 1 | | + | +
| | | | | | + | | | | | | | + | +
| +---+ | +---+ | ++---+ ++ +---+ +---+ | + | +
| | | | | | ++ | | |+ | +
|0 | | | 0 | 0 | ++ | 0 | |+ | +
| | | | | | ++ | | |+ | +
+---+ + +-------+ +---+| +|+ | +
+ + | +
0 1 2 3 4 5 6 7 8 9 10 11 12 + v: w u m u 1 0 2 4
题目解析:
按题目逻辑去实现即可,判断好数字、字母就行
代码实现:
#include <iostream>
#include <string>
using namespace std;
int getMaxStrLength(string s) {
int left = 0;
int right = 0;
int max = 0;
int cnt = 0;
while (right < s.size()) {
cnt = 0;
while (right < s.size()) {
if (isalpha(s[right])) {
cnt += 1;
}
if (cnt == 2) {
break;
}
right++;
}
max = max < right - left ? right - left : max;
if (cnt < 2) {
break;
}
while (left < right) {
if (isalpha(s[left])) {
cnt -= 1;
}
left++;
if (cnt == 1) {
break;
}
}
}
return max;
}
int main() {
string s;
cin >> s;
int cnt1 = 0;
int cnt2 = 0;
for (auto i : s) {
isdigit(i) ? ++cnt1 : ++cnt2;
}
if (cnt1 == s.size() || cnt1 == 0) {
cout << -1 << endl;
return 0;
}
cout << getMaxStrLength(s) << endl;
return 0;
}