[Leetcode解題] 1400. Construct K Palindrome Strings

11 January 2025
medium string greedy hashmap

題目

1400. Construct K Palindrome Strings

這題給定一個字串,以及一個數字k,求能不能將字串切成k組,並且各組皆為回文字串

解題思路

這題我們可以數每個字元出現的次數,因為我們要特別注意的只有出現奇數次的狀況,如果出現奇數次字母的次數大於k的話,那麼一定無法滿足需求。

另外,如果k比字串長度大的話,也無法滿足需求,這兩個狀況都相當直覺。

那我們來想反面,為什麼只要奇數次字母的次數小於等於k的話,就一定能找到相符的組合。

首先,我們先考慮等於的狀況,等於的狀況,其實就是將每個字母單獨拆開,所以必定可以。

而小於的狀況,我們可以先把所有奇數次的字母,假設有m個,單獨拆開為一組,而剩下所有為出現偶數次的字母,可以以任意方式組成剩下(k-m)個回文字串。

程式碼

class Solution:
    def canConstruct(self, s: str, k: int) -> bool:
        if k > len(s):
            return False
        count = dict()
        for c in s:
            count.setdefault(c, 0)
            count[c] += 1

        num_of_odds = 0
        for v in count.values():
            if v % 2 == 1:
                num_of_odds += 1
        
        if num_of_odds <= k:
            return True
        return False

時間複雜度

$O(n)$