构造 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个回文字符串。请问为什么字符的奇数次数会影响构造回文字符串的可能性?
▷🦆
题解中使用了Counter类来统计字符出现的次数。此方法是否适用于所有字符集,例如包含非英文字符的字符串?
▷🦆
题解中提到,如果s的长度小于k,则无法构造k个非空回文字符串。能否详细解释为什么字符串长度小于k时,一定不能构造出所需的回文字符串?
▷🦆
题解中计算奇数次字符的方法是遍历Counter的值。这种方法是否最优?有没有可能通过其他方式在统计字符时直接得出奇数次字符的数量?
▷