1227. Первый словарь Энди

 

У Энди есть мечта – он хочет создать свой собственный словарь. Но для него это не простая задача, так как количество известных ему слов достаточно мало. Вместо того чтобы вспоминать слова, у Энди возникла великолепная идея. Он решил взять с полки свою любимую книгу и выписать из нее все различные слова. Далее он расположил все слова в алфавитном порядке. Конечно, такая работа занимает много времени, поэтому ему может помочь компьютерная программа.

Вам необходимо написать программу, которая выводит все различные слова в тексте. Словом называется последовательность заглавных и прописных букв латинского алфавита. Слово может состоять из одной буквы. Более того, программа не должна быть чувствительной к регистру. Например, слова “Apple”, “apple” или “APPLE” считаются одинаковыми.

 

Вход. На вход подается текст, который содержит не более 5000 строк. Каждая строка содержит не более 200 символов.

 

Выход. Вывести следует список разных слов, встречающихся в тексте, каждое слово выводить в отдельной строке. Слова должны содержать только прописные буквы и быть отсортированными в алфавитном порядке. Количество различных слов во входном тексте не превышает 6000.

 

Пример входа

Adventures in Disneyland
 
Two blondes were going to Disneyland when they came to a fork in the road. The sign read: "Disneyland Left."
 

So they went home.

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

a
adventures
blondes
came
disneyland
fork
going
home
in
left
read
road
sign
so
the
they
to
two
went
were

when

 

 

РЕШЕНИЕ

структуры данных - set

 

Анализ алгоритма

Читаем текст, выделяем из него слова, состоящие из символов латинского алфавита, и заносим их в переменную типа множество (set). Слова автоматически сортируются. Если некоторое слово в тексте повторяется, то во множество оно будет занесено  только один раз. Далее при помощи итератора последовательно выводим слова. Если в последовательности букв встречается апостроф (например andy’s), то такую последовательность считаем как два разных слова: andy и s.

 

Реализация алгоритма

Объявим переменную SetS типа set<string>, в которую будем заносить найденные слова. Читать входные слова будем в символьный массив s.

 

set<string> SetS;

set<string>::iterator iter;

char s[201];

 

Поскольку текст не обязательно начинается с буквы латинского алфавита, то пропустим начальные символы, не являющиеся буквами.

 

scanf("%[^a-zA-Z]",s);

 

Читаем слово, состоящее только из заглавных и прописных букв латинского алфавита в переменную s, заменяем все буквы на маленькие и заносим слово во множество SetS. Пропускаем все символы, не являющиеся буквами, читая их в массив s.

 

while(scanf("%[a-zA-Z]",s) == 1)

{

  for(int i = 0; i < strlen(s); i++) s[i] = tolower(s[i]);

  SetS.insert(s);

  scanf("%[^a-zA-Z]",s);

}

 

Выводим слова в алфавитном порядке.

 

for(iter = SetS.begin(); iter != SetS.end(); iter++)

  printf("%s\n",(*iter).c_str());

 

Java реализация

 

import java.util.*;

 

public class Main

{

  public static void main(String[] args)

  {

    Scanner con = new Scanner(System.in);

    TreeSet<String> Set = new TreeSet<String>();   

    while(con.hasNext())

    {

      String Line = con.nextLine();

      Line = Line.replaceAll("[^a-zA-Z]", " ");

      Line = Line.toLowerCase();

      String LineArray[] = Line.split(" ");

      for(int i = 0; i < LineArray.length; i++)

        if (!LineArray[i].equals("")) Set.add(LineArray[i]);

    }

    for(String Line : Set) System.out.println(Line);

  }

}