携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第17天,点击查看活动详情
一、题目描述:
409. 最长回文串 - 力扣(LeetCode) (leetcode-cn.com)
给定一个包含大写字母和小写字母的字符串 s ,返回 通过这些字母构造成的 最长的回文串 。
在构造过程中,请注意 区分大小写 。比如 "Aa" 不能当做一个回文字符串。
示例 1:
输入:s = "abccccdd"
输出:7
解释:
我们可以构造的最长的回文串是"dccaccd", 它的长度是 7。
示例 2:
输入:s = "a"
输入:1
示例 3:
输入:s = "bb"
输入: 2
提示:
- 1 <= s.length <= 2000
- s 只能由小写和/或大写英文字母组成
二、思路分析:
我们可以题目只要求我们求回文串的长度,偶数个相同的字母是一定能组成一个回文串的。
所以我们使用set,来匹配2个相同的字母,遍历String,如果遍历的字母在set中出现,则移除出set并在结果长度上加2。
如果没出现相同的,则放入set。
最后因为回文串可以有一个单独的字母放在中间,所以我们检查我们得出的结果长度是不是小于所有字母的数量,如果小于,则表明至少有一个单独的字母,那么再把结果加一。
三、AC 代码:
class Solution {
public int longestPalindrome(String s) {
Set<Character> set = new HashSet<>();
int length = 0;
for(int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if(set.contains(c)) {
length += 2;
set.remove(c);
}
else{
set.add(c);
}
}
if(length < s.length()){
length++;
}
return length;
}
}
范文参考:
寻找好基友抱团出道成回文,被淘汰的最后也能到达终点。 - 最长回文串 - 力扣(LeetCode)