LeetCode-Python-1400. 构造 K 个回文字符串(字符串 + 哈希表)

给你一个字符串 s 和一个整数 k 。请你用 s 字符串中 所有字符 构造 k 个非空 回文串 。

如果你可以用 s 中所有字符构造 k 个回文字符串,那么请你返回 True ,否则返回 False 。

示例 1:

输入:s = "annabelle", k = 2
输出:true
解释:可以用 s 中所有字符构造 2 个回文字符串。
一些可行的构造方案包括:"anna" + "elble","anbna" + "elle","anellena" + "b"
示例 2:

输入:s = "leetcode", k = 3
输出:false
解释:无法用 s 中所有字符构造 3 个回文串。
示例 3:

输入:s = "true", k = 4
输出:true
解释:唯一可行的方案是让 s 中每个字符单独构成一个字符串。
示例 4:

输入:s = "yzyzyzyzyzyzyzy", k = 2
输出:true
解释:你只需要将所有的 z 放在一个字符串中,所有的 y 放在另一个字符串中。那么两个字符串都是回文串。
示例 5:

输入:s = "cr", k = 7
输出:false
解释:我们没有足够的字符去构造 7 个回文串。
 

提示:

1 <= s.length <= 10^5
s 中所有字符都是小写英文字母。
1 <= k <= 10^5

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/construct-k-palindrome-strings
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路:

首先处理一下比较简单的情况:

1. 如果 s 的长度和 k 相等,那么每个字符单独构成一个字符串,答案必然存在。

2. 如果 s 的长度比 k 要小,那么答案必不可能存在。

现在我们能保证 s 的长度大于 k。

其次统计一下 s 里每种元素出现的个数:

1. 如果一个元素出现次数为偶数次( k ),我们最少可以用 零个回文字符串,最多可以用 k 个回文字符串。

2. 如果一个元素出现次数为奇数次( k ),那么为了处理这个元素,我们必然至少需要一个回文字符串,最多可以用 k 个回文字符串。

所以实际上对答案有影响的就是 出现了奇数次的元素的个数,假设有 A 个元素的出现次数为奇数次,那么我们至少需要 A 个回文字符串。

对于其他的出现次数为偶数次的元素,我们可以将这偶数个字符包裹住已有的回文串,因此对回文串的个数没有影响。

时间复杂度:O(N)

空间复杂度:O(N)

class Solution(object):
    def canConstruct(self, s, k):
        """
        :type s: str
        :type k: int
        :rtype: bool
        """
        if k >= len(s):
            # 长度 == k,必然可以;长度 < k,必然不可以。
            return k == len(s)

        from collections import Counter
        dic = Counter(s) 

        s_odd = 0
        for val in dic.values():
            if val % 2:
                s_odd += 1
        return s_odd <= k
发布了734 篇原创文章 · 获赞 121 · 访问量 21万+

猜你喜欢

转载自blog.csdn.net/qq_32424059/article/details/105549613
今日推荐