leetcode 1400. 构造 K 个回文字符串
文章目录
一、题目
1.题目描述
给你一个字符串 s,找到 s 中最长的回文子串。
示例 1:
输入:s = "babad"
输出:"bab"
解释:"aba" 同样是符合题意的答案。
示例 2:
输入:s = "cbbd"
输出:"bb"
提示:
1 <= s.length <= 1000s仅由数字和英文字母组成
2.基础框架
C++基础框架代码如下:
bool canConstruct(string s, int k) {
}
3.解题思路
- 题目分析
- 构成回文子串可以是纯对的字母组合:比如abba、cabbac,亦或者是纯对字母加上中间为单个字母的组合,比如:abcba、cabybac,甚至单个字母也可以成为回文子串,比如d。
- 题目要求是:如果可以得到
k个回文字符串,就为true否则为false。 - 通过1中举的例子可知,奇数个数的字母可以组合成一个回文字符串,比如上面回文字符串中的奇数个数的字母为
c、y、d,如果奇数个数的字母数量cnt超过题目中限定的k,那就不存在k个回文字符串。多出来的奇数个数的字母数(cnt - k)只能插入到已经是回文字符串的组合中,必然最后还是达不到k个回文字符串的要求。 - 首先使用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; }










