Задача палиндром наибольшей длины, полученный с помощью соединений из слов, состоящих из двух букв.
https://t.me/ai_machinelearning_big_dataJune
Сложность: Средняя
Условие задачи: дан массив строк, каждый элемент которого состоит из двух букв английского алфавита в нижнем регистре.
Необходимо создать палиндром наибольшей длины путем выбора некоторых элементов из массива строк и компаниовки их в любом порядке. Каждый элемент массива можно использовать не более одного раза.
В ответе надо вернуть длину такого палидрома.
Палиндром - строка, которая одинаково читаются слева направо и справа налево.
Пример:
Ввод: 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
Решение:

func longestPalindrome(words []string) int {
n := len(words)
count := make(map[string]int, n)
length := 0
// for every word that has its corresponding reversed word, it will definitely be included in the final palindrome length
for _, word := range words {
reversed := reverse(word)
if v, ok := count[reversed]; ok {
length += 4
if v == 1 {
delete(count, reversed)
} else {
count[reversed]--
}
} else {
count[word]++
}
}
// among unused words, if there is a word with the same letters, we can add it to the final palindrome length
for word, _ := range count {
if isPair(word) {
length += 2
break
}
}
return length
}
func reverse(s string) string {
ss := make([]byte, 2)
ss[0], ss[1] = s[1], s[0]
return string(ss)
}
func isPair(s string) bool {
return s[0] == s[1]
}