Другие ответы, которые говорят, что это как минимум O (mn ^ 2) или O (n ^ 3), неверны. Это можно сделать за время O (mn), где m - размер строки, а n - количество строк.
Для простоты начнем с предположения, что все символы являются ascii.
У вас есть структура данных:
int counts[m][255]
где count [x] [y] - количество строк, имеющих символ ascii y с индексом x в строке.
Теперь, если вы не ограничиваетесь ascii, вам нужно использовать std :: map
map counts[m]
Но это работает так же, при индексах m в счетчиках у вас есть карта, в которой каждая запись в карте y, z сообщает вам, сколько строк z использует символ y в индексе m. Вы также хотели бы выбрать карту с постоянным временем поиска и постоянным временем вставки, чтобы соответствовать сложности.
Возвращаясь к ascii и массиву
int counts[m][255] // start by initializing this array to all zeros
Сначала инициализируйте структуру данных:
м - размер струн,
vec - это std :: vector со строками
for (int i = 0; i < vec.size(); i++) {
std::string str = vec[i];
for(int j = 0; j < m; j++) {
counts[j][str[j]]++;
}
}
Теперь, когда у вас есть эта структура, вы можете легко вычислить баллы:
for (int i = 0; i < vec.size(); i++) {
std::string str = vec[i];
int score = 0;
for(int j = 0; j < m; j++) {
score += counts[j][str[j]] - 1; //subtracting 1 gives how many other strings have that same char at that index
}
std::cout << "string \"" << str << "\" has score " << score;
}
Как видно из этого кода, это O (m * n)