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之類可以自動延伸的容器存儲。