1、
题目描述
小红拿到了一个字符串,她希望你帮她切割成若干子串,满足以下两个条件:
子串长度均为不小于 3 的奇数。
子串内部的字符全部相同。
输入
第一行输入一个正整数n,代表字符串长度。第二行输入一个字符串,仅由小写字母组成。
输出
如果无解,请输出-1。否则按顺序输出若干个字符串,用空格隔开。
样例输入
11
aaabbbbbbbb
样例输出
aaa bbb bbbbb
提示
在样例中,长度为 8 的 bbb…b 子串在样例输出中被分为了 bbb 和 bbbbb,在只要满足题目给定的条件下,将其分为 bbbbb 和 bbb 也对。
也就是输出还可以为:
aaa bbbbb bbb
数据范围:
1 < n ≤ 200000
2、解答
#include <iostream>
#include <vector>
#include <sstream> // 用于字符串流
int main()
{
std::vector<std::string> S;
int n, count = 1, num = 0;
std::string line;
std::cin >> n;
std::cin.ignore();
std::getline(std::cin, line);
int length = n;
for (int i = 0; i < length; i++)
{
while (line[i] > 'z' || line[i] < 'a')
{
std::cout << -1 << std::endl;
return 0;
}
if (line[i] == line[i + 1])
{
count ++;
continue;
}
if (count % 2)//奇数
{
num = num + count;
std::string s1 = line.substr(num-count, count);
S.push_back(s1);
}
else
{
num = num + count;
if (count < 6)
{
std::cout << -1 << std::endl;
return 0;
}
else
{
int min = 3;
std::string s2 = line.substr(num - count, min);
std::string s3 = line.substr(min, count-min);
S.push_back(s2);
S.push_back(s3);
}
}
count = 1;
}
for (const std::string& str : S) {
std::cout << str <<" ";
}
return 0;
}
3、关键
主要是最后一起输出,不能找到一组就输出,后面可能不满足的条件。
面对未知的字符串个数时,立马应该想到用vector之类可以自动延伸的容器存储。