두 글자 단어를 연결하여 가장 긴 회문

1663 단어 theabbieleetcodedsa
문자열 배열words이 제공됩니다. words의 각 요소는 두 개의 영문 소문자로 구성됩니다.
words에서 일부 요소를 선택하고 원하는 순서로 연결하여 가능한 가장 긴 회문을 만듭니다. 각 요소는 최대 한 번만 선택할 수 있습니다.

생성할 수 있는 가장 긴 회문의 길이를 반환합니다. 회문을 생성할 수 없는 경우 0 를 반환합니다.

회문(palindrome)은 앞으로 읽으나 뒤로 읽으나 같은 문자열입니다.

예 1:

입력: 단어 = ["lc","cl","gg"]
출력: 6
설명: 가장 긴 회문은 길이가 6인 "lc"+ "gg"+ "cl"= "lcggcl"입니다.
"clgglc"는 만들 수 있는 또 다른 가장 긴 회문입니다.

예 2:

입력: 단어 = ["ab","ty","yt","lc","cl","ab"]
출력: 8
설명: 가장 긴 회문은 길이가 8인 "ty"+ "lc"+ "cl"+ "yt"= "tylcclyt"입니다.
"lcyttycl"은 만들 수 있는 또 다른 가장 긴 회문입니다.

예 3:

입력: 단어 = ["cc","ll","xx"]
출력: 2
설명: 가장 긴 회문 중 하나는 길이가 2인 "cc"입니다.
"ll"은 만들 수 있는 또 다른 가장 긴 회문이며 "xx"도 마찬가지입니다.

제약:
  • 1 <= words.length <= 105
  • words[i].length == 2
  • words[i] 영문 소문자로 구성되어 있습니다.

  • 해결책:

    from collections import Counter
    
    class Solution:
        def longestPalindrome(self, words: List[str]) -> int:
            ctr = Counter(words)
            longest = 0
            isDouble = False
            for word in list(ctr.keys()):
                if word[0] == word[1]:
                    longest += 4 * (ctr[word] // 2)
                    rem = ctr[word] % 2
                    ctr[word] = rem
                    if rem == 1:
                        isDouble = True
                else:
                    k = min(ctr[word], ctr[word[::-1]])
                    longest += 4 * k
                    ctr[word] -= k
                    ctr[word[::-1]] -= k
            if isDouble:
                longest += 2
            return longest
    

    좋은 웹페이지 즐겨찾기