[LeetCode] 409.最长回文串(Easy)C语言题解

题目

  • 给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串。
  • 在构造过程中,请注意区分大小写。比如 “Aa” 不能当做一个回文字符串。

示例

①示例1

  • 输入:“abccccdd”
  • 输出:7
  • 解释:我们可以构造的最长的回文串是"dccaccd", 它的长度是 7。

说明

注意:假设字符串的长度不会超过 1010。

①相关话题

  • 哈希表

②题目地址

  • 409. 最长回文串 — 力扣网
  • 409. Longest Palindrome — leetcode

解题方法

①哈希表

  • 可用数组模拟的哈希表求解,速度最快(用空间换时间)。
  • 先用哈希表记录每个字母的出现次数,然后注意回文串的中心可以是单个字母,但其余对称位置必须是相同的字母(即出现偶数次的字母)。
  • 时间复杂度:O(N)。
  • 空间复杂度:O(N)。

代码详解

  • 哈希表
int longestPalindrome(char* s) {
    int hash[52] = {0}, flag = 1, len = strlen(s), result = 0;
    
    // 用哈希表记录每个字母的出现次数。
    for (int i = 0; i < len; i++) {
        if (s[i] >= 'a')
            hash[s[i]-'a'+26]++;
        else
            hash[s[i]-'A']++;
    }
    for (int i = 0; i < 52; i++) {
        if (hash[i] > 0) {
            // 一个字母可以作为回文串的中心(1次)。
            if (hash[i] % 2 != 0 && flag == 1) {
                result++;
                flag = 0;
            }
            
            // 除中心外的对称位置必须是相同的字母(即出现偶数次的字母)。
            result += (hash[i]/2) * 2;
        }
    }
    
    return result;
}

附录

  • 我的个人博客:messi1002.top
  • 如有错误或疑惑之处 请联系 [email protected]
  • 所有题目解答:fork me on github

你可能感兴趣的:(LeetCode-C,LeetCode-C)