题目描述:
输入一个字符串(不含空格), 请寻找输入中包含所有蛇形字符串。
蛇形字符串定义:
- 1.蛇形字符串由连续字符对组成,其特点如下:
- 1.1 字符对定义:字符对由同一字母的大写和小写组成(前大后小)。如:Aa,Dd;
- 1.2 蛇形字符串中包含的字符对,必须是连续字母,并按照字母顺序排序。如:AaBbCc或OoPpQqRrSs;
- 2.从输入中寻找字符组成蛇形字符串(字符顺序不限),符合规则:
- 2.1 每次寻找必须是最长的蛇形字符串;
- 2.2 使用过的字符不能重复使用;
例: 输入SxxsrR^AaSs
正确处理过程:
- Step1:SxxsrR^AaSs -> RrSs (找到两对连续字符对:Ss、Rr,可以组成蛇形字符串。另,Ss后应该是Tt,但当前字符串SxxsrR^AaSs中不包含,所以当前蛇形字符串到Ss结束。本轮查找结果是RrSs。)
- Step2:xs^AaSs -> Aa
- Step3:xx^Ss -> Ss
output:RrSs
Aa
Ss
输入描述:
一个字符串(不含空格,字符串长度<=5000)
输出描述:
所有包含的蛇形字符串,按蛇形字符串长短输出;同一个首字母的情况,按首字母升序排列(即A在Z前);如果没有找到,输出Not Found。
示例1:
输入:SwSE$3454356DD$$E#eswsxxsssAAWDxxdderfvcRFER65645hbg^^%%^UnbnvccTRChnyvcxcvVCFR
输出:
CcDdEeFf
CcDdEe
RrSs
VvWw
Ss
答题思路:
- 统计大写字母小写字母分别出现次数
- 统计一个字母大小写同时出现的次数,取最小次数保存,另一个丢弃(这里保存大写/小写均可,但如果保存大写就都大写)
- 寻找最大的连续字符数,输出。
参考代码:
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
string str;
while(cin >> str)
{
int strs[26] = {0};
int strl[26] = {0};
for(int i = 0; i < str.size(); i++) //统计字符
{
if(str[i] >= 'a' && str[i] <= 'z')
strs[str[i] - 'a']++;
else if(str[i] >= 'A' && str[i] <= 'Z')
strl[str[i] - 'A']++;
}
vector<int> myvector(26);
for(int i = 0; i < 26; i++) //字符匹配
{
if(strs[i] && strl[i])
strs[i] > strl[i] ? myvector[i] = strl[i] : myvector[i] = strs[i];
}
int flag = 0; //标志最大字符串的起始位置
int con = 0; //连续字符个数
int max = 0; //标志最大连续字符是多少位 后面的数据 > max 才赋值
if(count(myvector.begin(), myvector.end(), 0) == 26)
cout << "Not Found" << endl;
else
{
while(count(myvector.begin(), myvector.end(), 0) != 26) //输出字符,直到 vector 全为零
{
for(int i = 0; i < 26; i++)
{
if(myvector[i] != 0) //统计连续字符数
con++;
else
{
if(con > max)
{
max = con;
flag = i - max; //最大连续字符起始位置
}
con = 0;
}
}
//output
for(int i = flag; i < flag + max; i++)
{
char char1 = i + 'A';
char char2 = i + 'a';
cout << char1 << char2;
myvector[i]--;
}
cout << endl;
flag = 0;
max = 0;
}
}
}
return 0;
}
/*===============================================
键盘输入:
SwSE$3454356DD$$E#eswsxxsssAAWDxxdderfvcRFER65645hbg^^%%^UnbnvccTRChnyvcxcvVCFR
函数输出:
CcDdEeFf
CcDdEe
RrSs
VvWw
Ss
===============================================*/