Задача палиндром наибольшей длины, полученный с помощью соединений из слов, состоящих из двух букв.
https://t.me/ai_machinelearning_big_data
Сложность: Средняя
Условие задачи: дан массив строк, каждый элемент которого состоит из двух букв английского алфавита в нижнем регистре.
Необходимо создать палиндром наибольшей длины путем выбора некоторых элементов из массива строк и компаниовки их в любом порядке. Каждый элемент массива можно использовать не более одного раза.
В ответе надо вернуть длину такого палидрома.
Палиндром - строка, которая одинаково читаются слева направо и справа налево.
Пример:
Ввод: words = ["lc","cl","gg"]
Вывод: 6
Объяснение: lc" + "gg" + "cl" = "lcggcl" или же "clgglc", но оба имеют максимальную длину 6.
Ввод: words = ["ab","ty","yt","lc","cl","ab"]
Вывод: 8
Объяснение: "ty" + "lc" + "cl" + "yt" = "tylcclyt" или "lcyttycl"
Ввод: words = ["cc","ll","xx"]
Вывод: 2
Решение:
Временная сложность: O(N)
Пространственная сложность: O(26*26)

class Solution {
public:
int longestPalindrome(vector<string>& words) {
int n = words.size();
vector<vector<int>> counter(26,vector<int>(26,0));
int ans=0;
// for different letters in the word
for(string s:words){
int a = s[0]-'a'; // first letter
int b = s[1]-'a'; // second letter
// if the reverse of the word exists i.e like for "lc" if "cl" exists
if(counter[b][a]) {
ans+=4; // count increase by 2+2 = 4
counter[b][a]--; // remove the occurance of the word from counter
}
else counter[a][b]++; // if original doesn't exits in counter array then increase in counter
}
// for same letters in the word
for(int i=0;i<26;i++){
if(counter[i][i]){ // if both the letters are same
ans+=2; // increase by 2 i.e like for "gg"
break;
}
}
return ans;
}
};