題目
給一個大小寫組成的字符串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);
}
};