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

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

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]
}



Report Page