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之类可以自动延伸的容器存储。