Матч
44, Младший брат (YoungBrother)
Джон набрал текст в текстовом
редакторе. Текст состоит из n строк,
каждая строка содержит в точности k
символов. Его младший брат в некоторых местах вставил символы разрыва строки, а
также уничтожил некоторые уже существующие символы разрыва строки. К счастью,
ни один другой символ удален не был. Помогите Джону восстановить исходный
текст.
Класс: YoungBrother
Метод: vector<string>
restoreWords(vector<string> lines,
int n, int
k)
Ограничения: lines содержит от 1 до 50 элементов, lines[i]
содержит от 0 до 50 символов ‘a’ – ‘z’, 1 £ n £ 50, 0 £ k £ 50, lines содержит в
точности n * k символов.
Вход. Массив строк lines, задающий текст, и два целых числа n и k.
Выход. Восстановленный исходный текст Джона.
Пример входа
lines |
n |
k |
{"jhgu", "", "a",
"kjl"} |
2 |
4 |
{"","",""} |
1 |
0 |
{"tkwyslbgxegjvdaafcnxhetx","xwuqmvepmkxl"} |
6 |
6 |
Пример выхода
{"jhgu", "akjl"}
{""}
{"tkwysl", "bgxegj",
"vdaafc", "nxhetx", "xwuqmv", "epmkxl"}
РЕШЕНИЕ
обработка текста
Объединим все строки массива
lines в одну строку all, используя
функцию accumulate. Далее разобьем строку all
на подстроки по k символов. i - ая подстрока начинается с i*k
- го символа строки all и имеет длину
k.
ПРОГРАММА
#include <cstdio>
#include <string>
#include <vector>
#include <numeric>
using namespace std;
class YoungBrother
{
public:
vector<string> restoreWords(vector<string> lines, int n, int k)
{
vector<string> res;
string all = accumulate(lines.begin(),lines.end(),string());
for(int
i = 0; i < n; i++)
res.push_back(all.substr(i * k,k));
return res;
}
};