LintCode-627: Longest Palindrome

这题其实是数学题。思路就是遍历所有字符,记下其个数。然后某个字符如果是偶数个的话一定会全部放到回文串中,如果是奇数的话,可以减去一个放到回文串中。
注意:
1) 最长的那个奇数字符串可以放到中间,所以最后当奇数字符存在时sumLen要+1。
2) 若奇数字符不存在sumLen则不动。注意”aaaa”的case。

int longestPalindrome(string &s) {
    if (s.size()==0) return 0;
    int sumLen=0;
    int oddNum=0;

    unordered_map<char, int> hashmap;
    for (int i=0; i<s.size(); ++i) {
        if (hashmap.find(s[i])!=hashmap.end()) {
            hashmap[s[i]]++;    
        } else {
            hashmap[s[i]]=1;
        }
    }

    for (auto h : hashmap) {
        if (h.second & 0x1) {
            oddNum++;
            sumLen += h.second-1;
        } 

        if (!(h.second & 0x1)) {
            sumLen += h.second;
        } 
    }

    return oddNum? sumLen+1 : sumLen;
}

猜你喜欢

转载自blog.csdn.net/roufoo/article/details/80382881
今日推荐