leetcode
leetcode 1251 ~ 1300
构造 K 个回文字符串

构造 K 个回文字符串

难度:

标签:

题目描述

代码结果

运行时间: 60 ms, 内存: 17.1 MB


/*
 * Problem: Given a string s and an integer k, determine if you can construct k non-empty palindrome strings using all characters in s.
 * Approach:
 * 1. Count the frequency of each character in the string using Java Streams.
 * 2. Count how many characters have an odd frequency (oddCount).
 * 3. If oddCount is greater than k, return false (since each palindrome can have at most one odd character).
 * 4. If the length of the string is less than k, return false (not enough characters to form k palindromes).
 * 5. Otherwise, return true.
 */

import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;

public class Solution {
    public boolean canConstruct(String s, int k) {
        if (s.length() < k) return false;
        Map<Character, Long> charCount = s.chars()
                                          .mapToObj(c -> (char) c)
                                          .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
        long oddCount = charCount.values().stream()
                                 .filter(count -> count % 2 != 0)
                                 .count();
        return oddCount <= k;
    }
}

解释

方法:

要构造k个回文字符串,首先考虑基本的回文特性:一个回文字符串中,除了最多一个字符可以出现奇数次,其余所有字符都应该出现偶数次。针对这个属性,我们可以首先统计字符串s中每个字符的出现次数。如果s的长度小于k,显然无法构造k个非空回文字符串,直接返回False。接着,统计有多少个字符的出现次数是奇数(这些奇数次数的字符分别至少需要一个回文字符串来容纳它们自己)。如果奇数次数的字符数大于k,那么也不能构成k个回文字符串。否则,可以通过调整字符的分配来满足构造k个回文字符串的要求。

时间复杂度:

O(n)

空间复杂度:

O(1)

代码细节讲解

🦆
在题解中提到,如果字符的奇数出现次数多于k,就无法构造k个回文字符串。请问为什么字符的奇数次数会影响构造回文字符串的可能性?
回文字符串的特性是,除了最多一个字符可以出现奇数次,其余所有字符都应该出现偶数次。因此,如果有多个字符出现了奇数次,每个这样的字符至少需要一个单独的回文字符串来放置这个奇数次的字符,以确保其他字符都能成对出现。如果奇数次的字符数量超过了可用的回文字符串数量k,那么将没有足够的回文字符串来分别容纳这些奇数次字符,从而无法形成k个回文字符串。
🦆
题解中使用了Counter类来统计字符出现的次数。此方法是否适用于所有字符集,例如包含非英文字符的字符串?
Python的Counter类是基于字典的,它可以统计任何可哈希的对象的出现次数,包括所有的Unicode字符。因此,使用Counter类来统计字符串中字符的出现次数是适用于包括非英文字母在内的所有字符集的。这使得Counter类非常适合处理多语言文本或包含各种符号和表情的字符串。
🦆
题解中提到,如果s的长度小于k,则无法构造k个非空回文字符串。能否详细解释为什么字符串长度小于k时,一定不能构造出所需的回文字符串?
如果字符串s的长度小于k,意味着至少有k个位置需要被填充以形成k个非空回文字符串。每个回文字符串至少需要一个字符,所以当s的长度小于k时,就不可能构造出k个非空的回文字符串,因为没有足够的字符来填充每个回文字符串至少一个字符。这是一个简单的数学上的限制。
🦆
题解中计算奇数次字符的方法是遍历Counter的值。这种方法是否最优?有没有可能通过其他方式在统计字符时直接得出奇数次字符的数量?
题解中使用的遍历Counter值的方法是一个直观且有效的方式来统计奇数次字符的数量。尽管这种方法涉及遍历所有字符的计数,但在大多数情况下,这是效率相对较高的,因为字符种类通常远少于字符串的长度。然而,也可以在统计字符的同时维护一个奇数次数计数器,每次字符出现时,更新其计数,并相应地调整奇数次数计数器(如果字符计数从偶数变为奇数,增加奇数次计数器,从奇数变为偶数,则减少奇数次计数器)。这可能在某些情况下提高效率,尤其是在极长的字符串中。

相关问题