微信搜索:编程笔记本。获取更多干货!
微信搜索:编程笔记本。获取更多干货!
点击上方蓝字关注我,我们一起学编程
欢迎小伙伴们分享、转载、私信、赞赏
今天来看一道“外企德科-华为精英研发项目”的一道笔试编程题。
求满足条件的最长字串的长度
题目描述:
给定一个字符串,只包含字母和数字,按要求找出字符串中的最长(连续)子串,字符串本身是其最长的子串,子串要求:
- 只包含 1 个字母(a-z, A-Z),其余必须是数字
- 字母可以在子串中的任意位置
微信搜索:编程笔记本。获取更多干货!
微信搜索:编程笔记本。获取更多干货!
如果找不到满足要求的子串,如全是字母或全是数字,则返回 -1 。
输入描述:
字符串(只包含数字和字母)。
输出描述:
子串的长度。
示例:
- 输入:
abC124ACb
- 输出:
4
- 解释:
C124
或 124A
分析:
由于符合条件的子串有且仅有一个字母,因此我们可以统计每个字母出现的位置,相间一位的字母的位置决定了其包含的数字数量,这样问题就迎刃而解了。
参考代码:
微信搜索:编程笔记本。获取更多干货!
微信搜索:编程笔记本。获取更多干货!
#include <bits/stdc++.h>
using namespace std;
int main()
{
string s; // 出入的字符串
cin >> s;
int ans = -1;
vector<int> pos; // 记录字母的位置
pos.push_back(-1);
for (int i = 0; i < s.size(); ++i) {
if (isalpha(s[i])) {
pos.push_back(i);
}
}
pos.push_back(s.size());
for (int i = 0; i < pos.size() - 2; ++i) {
int diff = pos[i + 2] - pos[i];
if (diff > 2) {
ans = max(ans, diff - 1);
}
}
cout << ans << endl;
return 0;
}
微信搜索:编程笔记本。获取更多干货!
微信搜索:编程笔记本。获取更多干货!
测试一些边界:
jincheng@haofan$ ./a.out
123a
4
jincheng@haofan$ ./a.out
a123
4
jincheng@haofan$ ./a.out
123a123
7
jincheng@haofan$ ./a.out
a123a
4
jincheng@haofan$ ./a.out
aaa1aaa
2
jincheng@haofan$ ./a.out
aaa
-1
jincheng@haofan$ ./a.out
111
-1
jincheng@haofan$ ./a.out
可以看到,程序基本满足要求。