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.解题思路
- 题目分析
- 构成回文子串可以是纯对的字母组合:比如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; }