LeetCode No.409 最长回文串

571 阅读1分钟

给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串。

在构造过程中,请注意区分大小写。比如 "Aa" 不能当做一个回文字符串。

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

示例 1:

输入:
"abccccdd"
输出:
7

解释: 我们可以构造的最长的回文串是"dccaccd", 它的长度是 7。

哈希表

因为是打散构造回文字符串,那么只有奇数数量的字母才会被剩下1个。同时所有的偶数数量字母+1一个奇数数量的字母也可以构造回文字符串。

所以我们可以对给定字符串一次遍历,构造出哈希表。再遍历哈希表的每一个字母,记录下奇数数量字母的总数。

最后返回的是字符串长度 - 奇数数字字母的数量 + 1

鉴于本体约定了字符串仅包含字母,可以直接通过数组进行构造,减少哈希表带来的性能损失。

		public int longestPalindrome(String s) {
        // 找出可以构成最长回文串的长度
        int[] arr = new int[128];
        for(char c : s.toCharArray()) {
            arr[c]++;
        }
        int count = 0;
        for (int i : arr) {
            count += (i % 2);
        }
        return count == 0 ? s.length() : (s.length() - count + 1);
    }
  • 时间复杂度:O(n) 遍历两次,一次构造哈希表,一次遍历哈希表
  • 空间复杂度:O(n) 额外的哈希表空间