分析
- 此题不难,但是细节处比较多,而且不能理解错题意,题意是删除某些字符后,构成要求的序列,也就是只有第一组5个字符满足题意了,才开始找第二组中间7个满足的字符(不能直接统计整个字符串的每个字符总出现次数,然后拆分三组,这样是错的);
- 通过数组m去记录字符出现次数;用一个指针p指向每组开始的索引,下一组开始的索引就是在找到上一组的最后一个位置;
- 细节注意:在下一组寻找出现7次的字符,以及最后一组出现5次的字符,需要初始化m数组;然后当某一组满足题意,不能直接输出字符串,先暂存在s1 s2 s3中,当三组都满足才全部输出,不然会造成aaaaanone这种情况;
#include<bits/stdc++.h>
using namespace std;
string s, s1, s2, s3;
int f1, f2, f3;
int n;
int m[30];
int main() {
cin >> n >> s;
if (n < 17) {
cout << "none";
return 0;
}
int p = 0;//指向下一组开始查找字符串的起始索引
//找前5个
for (int i = p; i < n; i++) {
int t = s[i] - 'a';
m[t]++;
if (m[t] == 5) {
p = i + 1;
for (int k = 0; k < 5; k++) {
s1 += s[i];
}
f1 = 1;
break;
}
}
//找中间的7个,不能忘置空记录字母出现次数的数组
memset(m, 0, sizeof m);
for (int i = p; i < n; ++i) {
int t = s[i] - 'a';
m[t]++;
if (m[t] == 7) {
p = i + 1;
for (int k = 0; k < 7; k++) {
s2 += s[i];
}
f2 = 1;
break;
}
}
//找后面的5个,不能忘置空记录字母出现次数的数组
memset(m, 0, sizeof m);
for (int i = p; i < n; ++i) {
int t = s[i] - 'a';
m[t]++;
if (m[t] == 5) {
for (int k = 0; k < 5; k++) {
s3 += s[i];
}
f3 = 1;
break;
}
}
if (f1 && f2 && f3)
cout << s1 << s2 << s3;
else
cout << "none";
return 0;
}