文章目录
1. 题目来源
2. 题目说明
3. 题目解析
方法一:暴力+巧妙解法
以定量字母构造回文串,肯定首先就是统计所有字母个数及关心它的奇偶性,还是比较容易能想到解法的。简单讲解下思路:
- 首先开辟映射数组统计各个字符出现的次数,并遍历该数组所有奇数出现的次数
- 奇数次字符一定是在回文串中心的,要构造
k
个回文串,那么也就是说会产生k
个这样的回文串中心 - 由于单个字符也能构成回文串,所以当字符串长度小于
k
时回文串一定构成不了,直接返回false
即可 - 当字符串长度大于等于
k
时,如上面所说,k
回文串中心,一个奇数字符就需要占一个中心,若奇数字符个数大于k
则构成不了,返回false
否则返回true
即可
关键还是得理清思路,比赛时很快想到了,但也没来的及证明什么的,纠结耽误很长时间…
参见代码如下:
// 执行用时 :40 ms, 在所有 C++ 提交中击败了100.00%的用户
// 内存消耗 :12 MB, 在所有 C++ 提交中击败了100.00%的用户
class Solution {
public:
bool canConstruct(string s, int k) {
if (s.size() < k) return false;
int arr[26] = {0};
for (int i = 0; i < s.size(); ++i) ++arr[s[i] - 'a'];
int cnt = 0;
for (int i = 0; i < 26; ++i) if (arr[i] % 2 == 1) ++cnt;
if (cnt > k) return false;
return true;
}
};