Матч 432, Группированные слова (GroupedWordChecker)

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

 

Слово называется группированным, если для каждой его буквы все ее появления в слове образуют в точности одну последовательность. То есть никакие две одинаковые буквы не разделяются другими. Например, слова “ccazzzzbb” и “code” являются группированными, а “aabbbccb” и “topcoder” нет. Необходимо подсчитать количество группированных слов в массиве words.

 

Класс: GroupedWordChecker

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

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

 

Вход. Массив слов words.

 

Выход. Количество группированных слов в массиве words.

 

Пример входа

words

{"ccazzzzbb", "code", "aabbbccb", "topcoder"}

{"ab", "aa", "aca", "ba", "bb"}

{"yzyzy", "zyzyz"}

 

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

2

4

0

 

 

РЕШЕНИЕ

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

 

Функция Grouped проверяет, является ли слово s группированным. Заведем массив w, в котором положим w[i] = 1, если буква ‘a’ + i в слове уже встречалась. Далее просто подсчитываем количество группированных слов.

 

ПРОГРАММА

 

#include <cstdio>

#include <vector>

#include <string>

#include <memory>

using namespace std;

 

int Grouped(string s)

{

  int i, w[26];

  memset(w,0,sizeof(w));

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

  {

    if (w[s[i] - 'a'] > 0) return 0;

    w[s[i] - 'a'] = 1;

    while((i + 1 < s.size()) && (s[i] == s[i+1])) i++;

  }

  return 1;

}

 

class GroupedWordChecker

{

public:

  int howMany(vector<string> words)

  {

     int i,res;

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

      if (Grouped(words[i])) res++;

     return res;

  }

};