给定一个包含大写字母和小写字母的字符串 s ,返回 通过这些字母构造成的 最长的回文串 。
在构造过程中,请注意 区分大小写 。比如 "Aa" 不能当做一个回文字符串。
示例 1:
输入:s = "abccccdd"
输出:7
解释:
我们可以构造的最长的回文串是"dccaccd", 它的长度是 7。
示例 2:
输入:s = "a"
输入:1
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/longest-palindrome
class Solution
{
public:
int longestPalindrome(string s)
{
if (s.length() == 0) return 0;
int len = s.length();
alphabet al[52];//s只由大小写字母组成,撑死52个
//for (int i = 0; i < 52; i++)
// al[i].t = 0;
int cot = 0;
for (int i = 0; i < len; i++)
{
char p = s.at(i);
for (int j = 0; j < cot; j++)
{
if (al[j].a == p)
{
al[j].t++;
goto conti;
}
}
al[cot].a = p, al[cot].t = 1;
cot++;
conti:
continue;
}
int ret = 0;
bool onetag = 0;//这个是标识出现次数为奇数的字母有没有加上,如果加过为奇数的就不能再加了
for (int i = 0; i < cot; i++)
{
if (al[i].t % 2 == 0)
ret += al[i].t;
else
{
if (onetag == 0)
{
ret += al[i].t;
onetag = 1;
}
else ret += al[i].t - 1;
}
}
return ret;
}
struct alphabet
{
char a;
int t;
};
};
时间复杂度挺低的,大约O(n),会略高出跑结构体的时间,但是结构体才52个,字符串要是有100几乎就可以忽略了,何况最大1000.
看了题解,发现了很多值得注意的地方,比如我在空间复杂度方面所做的事情有点太大材小用了,根本用不到结构体,只需要一个数组sum[53](52也可,无非就是哈希函数差一),制定一个哈希函数,小写字母的个数存在1~26,大写字母放在27~52里面就可以把内循环的复杂度降为O(1),而且short型数组只需要2 * 52字节,结构体需要8 * 52字节(帮我自己回忆一下字节对齐)。
总体来说,虽然是个简单题,一遍过已经有了进步,下次再加油。