LeetCode笔记:最长回文串

问题

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

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

注意:

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

示例 1:

输入: "abccccdd"

输出: 7

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

解法

思路:

  1. 先统计出每个字母出现的次数
  2. 偶数数量的字母可以直接放在回文串的两边,所以直接取用,奇数数量的字母减掉一个变成偶数数量,也可以取用
  3. 最后特殊处理下,如果有奇数数量的字母,最大的奇数数量的字母可以放在中间位置,也就是最终结果需要+1

代码:

/**
 * @param {string} s
 * @return {number}
 */
var longestPalindrome = function (s) {
  // 用于统计每一个字母出现的次数
  const count = {};
  for (let i = 0; i < s.length; i++) {
    const str = s[i];
    // 重复出现的字母,次数+1
    if (str in count) {
      count[str] += 1;
    } else {
      // 新出现的字母开始计数
      count[str] = 1;
    }
  }
  let odd = false; // 是否包含奇数
  let result = 0; // 结果统计
  for (let letter in count) {
    const num = count[letter];
    // 出现次数为奇数的字母,减去一个即为偶数,可放在回文串的两边
    if (num % 2 === 1) {
      result += num - 1;
      odd = true;
    } else if (num % 2 === 0) {
      // 取偶数次数的字母
      result += num;
    }
  }
  // 只要有一个奇数数量的字母,就可以把其中最大奇数数量的字母放在中间位置,所以会多一个
  return odd ? result + 1 : result;
};

参考

评论