题目
给一个大小写组成的字符串s,利用s中的字母,能组成的最长回文新串的长度。
注意:大小写敏感,”Aa” 不是回文
例子:
s = “abccccdd”,其中字母可组成最长回文新串 “dccaccd”,长度为7
思路
回文的特点是左右字母对称,即由一对对的字母组成,中间可能包含一个单一不成对的字母。
扫描原串,利用列表isExist[26*2]记录字母是否出现过,当一个字母出现过两次时即该对字母可组成回文串一部分,把表中该字母出现过的标记清空;若还没出现过则在表中该字母对应位置打上标记。
最后回文长度 = 对数 * 2 + 1(若还存在单独的字母)
代码
class Solution {
public:
int longestPalindrome(string s) {
// A...Za...z
bool isExist[26*2] = {false};
// has_Single 记录表中为 true 的个数,即单独的字母的个数
int pairs = 0, has_Single = 0;
for (int i = 0; i < s.length(); i++) {
int index = s[i] >= 'a'? s[i] - 'a' + 26: s[i] - 'A';
if (isExist[index]) {
has_Single--;
pairs++;
isExist[index] = false;
} else {
has_Single++;
isExist[index] = true;
}
}
return pairs * 2 + (has_Single > 0? 1 : 0);
}
};