TCHS
08, Раунд 3, Подобные слова (SimilarWords)
Подобностью двух слов будем
называть количество в них общих букв. Буквы сравниваются без учета регистра.
Если некоторая буква встречается в одном слове k раз, а в другом m раз,
то в подобность слов эта буква вносит значение min(k, m).
Массив words содержит набор слов.
Необходимо найти два слова с наибольшим значением подобия и вернуть его.
Класс: SimilarWords
Метод: int
mostSimilarPair(vector<string> words)
Ограничения: words содержит от 2 до 50 элементов, words[i]
содержит от 1 до 50 символов ‘a’ – ‘z, ‘A’ – ‘Z’.
Вход. Массив строк words.
Выход. Наибольшее значение подобия двух
слов из массива words.
Пример входа
words |
{"aaB", "AbaAc"} |
{"abcdefg","ABCDEFG"} |
{"alnHFDfosKYFREanfETRiesf",
"fjsHDdoAFifASsd",
"GSDgsdGsdgJUsg", "KJmgnsNSFsngfn",
"njtdhMHGBSmnytgnGVNR"} |
Пример выхода
3
7
11
РЕШЕНИЕ
обработка строк
Для каждой пары слов a и b
вычисляем их подобие при помощи функции similar(a, b). Наибольшее
значение подобия возвращаем.
Опишем работу функции similar(a, b).
В отображении m1 подсчитываем, сколько раз встречается каждая буква строки a.
В m2 подсчитываем буквы строки b. При
подсчете все буквы переводим в нижний регистр. Например, значение m1[x] содержит значение, равное количеству
малых и больших букв x в строке a. Далее проходим по отображению m1 при
помощи итератора iter. Значение (*iter).first
равно букве из строки a, а (*iter).second равно количеству раз,
которое она встречается в a. Тогда
m2[(*iter).first] равно количеству
раз, которое эта буква встречается в b.
Поэтому для нахождения подобия слов следует просуммировать значения min((*iter).second, m2[(*iter).first]).
ПРОГРАММА
#include <cstdio>
#include <vector>
#include <string>
#include <map>
using namespace std;
int similar(string a, string b)
{
int i,res;
map<char,int>
m1,m2;
map<char,int>::iterator
iter;
m1.clear();m2.clear();
for(res=i=0;i<a.size();i++) m1[tolower(a[i])]++;
for(i=0;i<b.size();i++) m2[tolower(b[i])]++;
for(iter=m1.begin();iter!=m1.end();iter++)
res += min((*iter).second,m2[(*iter).first]);
return res;
}
class SimilarWords
{
public:
int mostSimilarPair(vector<string> words)
{
int i,j,temp,res;
for(res=i=0;i<words.size()-1;i++)
for(j=i+1;j<words.size();j++)
{
temp = similar(words[i],words[j]);
if (temp > res) res = temp;
}
return res;
}
};