Матч 402, Аббревиатура слов (WordAbbreviation)

Дивизион 2, Уровень 1

 

Имеется массив строк words, содержащий набор слов. Необходимо вернуть массив, i - ый элемент которого является аббревиатурой i - го слова. Аббревиатурой слова является наименьший непустой префикс, не являющийся префиксом никакого другого слова. Аббревиатура слов всегда существует.

 

Класс: WordAbbreviation

Метод: vector<string> getAbbreviations(vector<string> words)

Ограничения: words содержит от 1 до 50 строк, каждая из которых содержит от 1 до 50 символов ‘a’ – ‘z’, ни одно из слов не является префиксом другого.

 

Вход. Массив строк words, содержащий набор слов.

 

Выход. Массив, i - ый элемент которого является аббревиатурой i - го слова.

 

Пример входа

Words

{"abc","def","ghi"}

{"aaab","aaac","aaad"}

{"top","coder","contest"}

 

Пример выхода

{"a", "d", "g"}

{"aaab", "aaac", "aaad"}

{"t", "cod", "con"}

 

 

РЕШЕНИЕ

обработка строк

 

Перебираем слова в цикле по i. Для каждого слова в цикле по j перебираем его префиксы str, начиная с наименьшего. В цикле по k проверяем, не является ли слово str префиксом какого-нибудь другого слова. Если после выполнения цикла по k значение flag равно 1 (str является лишь префиксом одного слова, из которого оно порождено), то аббревиатура слова найдена и заносится в результирующий массив res.

 

ПРОГРАММА

 

#include <cstdio>

#include <vector>

#include <string>

using namespace std;

 

class WordAbbreviation

{

public:

  vector<string> getAbbreviations(vector<string> words)

  {

    int i,j,k,flag;

    vector<string> res;

    string str;

    for(i = 0; i < words.size(); i++)

    {

      for(j = 1; j <= words[i].size(); j++)

      {

        str = words[i].substr(0,j);

        for(flag = k = 0; k < words.size(); k++)   

          if (words[k].substr(0,str.size()) == str) flag++;

        if (flag == 1) break;

      }

      res.push_back(str);

    }

    return res;

  }

};