[LeetCode 双周赛23] 2. 构造 K 个回文字符串(暴力、巧妙解法)

文章目录

    • 1. 题目来源
    • 2. 题目说明
    • 3. 题目解析
      • 方法一:暴力+巧妙解法

1. 题目来源

链接:5362. 构造 K 个回文字符串

2. 题目说明

[LeetCode 双周赛23] 2. 构造 K 个回文字符串(暴力、巧妙解法)_第1张图片
[LeetCode 双周赛23] 2. 构造 K 个回文字符串(暴力、巧妙解法)_第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;
    }
};

你可能感兴趣的:(LeetCode周赛)