0
点赞
收藏
分享

微信扫一扫

leetcode 1400. 构造 K 个回文字符串

上善若水的道 2022-05-04 阅读 61

leetcode 1400. 构造 K 个回文字符串

文章目录

一、题目

1.题目描述

给你一个字符串 s,找到 s 中最长的回文子串。

示例 1:

输入:s = "babad"
输出:"bab"
解释:"aba" 同样是符合题意的答案。

示例 2:

输入:s = "cbbd"
输出:"bb"

提示:

  • 1 <= s.length <= 1000
  • s 仅由数字和英文字母组成

2.基础框架

C++基础框架代码如下:

bool canConstruct(string s, int k) {
}

3.解题思路

  • 题目分析
  1. 构成回文子串可以是纯对的字母组合:比如abbacabbac,亦或者是纯对字母加上中间为单个字母的组合,比如:abcbacabybac,甚至单个字母也可以成为回文子串,比如d
  2. 题目要求是:如果可以得到k个回文字符串,就为true否则为false
  3. 通过1中举的例子可知,奇数个数的字母可以组合成一个回文字符串,比如上面回文字符串中的奇数个数的字母为cyd,如果奇数个数的字母数量cnt超过题目中限定的k,那就不存在k个回文字符串。多出来的奇数个数的字母数(cnt - k)只能插入到已经是回文字符串的组合中,必然最后还是达不到k个回文字符串的要求。
  4. 首先使用hash数组记录字母的个数,将奇数个数的字母统计到cnt中,如果奇数个数的字母数大于k结果为false,否则为true。另外如果字符串s的长度小于k,也是不能有k个回文子串的。
  • 实现代码:

    bool canConstruct(string s, int k) {
        if (s.length() < k) return false;
        vector<int> rec(26);
        for (char i : s)
            ++rec[i - 'a'];
    
        int cnt = 0;
        for (auto i : rec)
            if (i & 1)
                ++cnt;
        return cnt <= k;
    }
    
举报

相关推荐

0 条评论