一【题目类别】
- 字符串
二【题目难度】
- 简单
三【题目编号】
- 409.最长回文串
四【题目描述】
- 给定一个包含大写字母和小写字母的字符串 s ,返回 通过这些字母构造成的 最长的回文串 。
- 在构造过程中,请注意 区分大小写 。比如 “Aa” 不能当做一个回文字符串。
五【题目示例】
-
示例 1:
- 输入:s = “abccccdd”
- 输出:7
- 解释:我们可以构造的最长的回文串是"dccaccd", 它的长度是 7。
-
示例 2:
- 输入:s = “a”
- 输入:1
六【解题思路】
- 利用哈希表的思想
- 统计每个字符出现的次数
- 如果某个字符出现的次数为偶数次,那么肯定能构成回文串,记录其出现次数即可
- 如果某个字符出现的次数为奇数次,那么其出现次数-1也能构成回文串,记录其出现次数-1即可
- 最后还需要判断有没有奇数个长度的字符,如果有的话那么它也能插入到回文串中形成一个更长的回文串(最多长度+1,因为之前如果有奇数长度的时候,我们已经将其长度-1为偶数长度纳入到结果中了),那么最后的结果+1,否则结果不变
- 最后返回结果即可
七【题目提示】
- 1 <= s.length <= 2000
- s 只由小写 和/或 大写英文字母组成
八【时间频度】
- 时间复杂度: O ( n ) O(n) O(n),其中 n n n 是字符串的长度
- 空间复杂度: O ( 1 ) O(1) O(1)
九【代码实现】
- Java语言版
package String;
public class p409_LongestPalindrome {
public static void main(String[] args) {
String s = "abccccdd";
int res = longestPalindrome(s);
System.out.println("res = " + res);
}
public static int longestPalindrome(String s) {
int[] map = new int[128];
for (char ch : s.toCharArray()) {
map[ch]++;
}
int res = 0;
boolean flag = false;
for (int i = 0; i < 128; i++) {
if (map[i] != 0) {
if (map[i] % 2 == 0) {
res += map[i];
} else {
res = res + map[i] - 1;
flag = true;
}
}
}
return flag == false ? res : res + 1;
}
}
- C语言版
#include<stdio.h>
#include<stdbool.h>
int longestPalindrome(char * s)
{
int map[128] = { 0 };
for (int i = 0; i < strlen(s); i++)
{
map[s[i]]++;
}
int res = 0;
bool flag = false;
for (int i = 0; i < 128; i++)
{
if (map[i] % 2 == 0)
{
res += map[i];
}
else
{
res = res + map[i] - 1;
flag = true;
}
}
return flag == false ? res : res + 1;
}
/*主函数省略*/
十【提交结果】
-
Java语言版
-
C语言版