【前端算法每日一题】leetcode-409-最长回文串(补2023-07-08)

105 阅读1分钟

题目描述

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

解题思路

  • 回文串通俗理解---多个偶数+一个奇数
  • 遍历计算字符串中相同字符的个数,使用map存储
  • 遍历map,计算可用偶数字符个数
  • 计算奇数字符的个数(大于0结果+1,否则+0)

解题代码(JavaScript)

var longestPalindrome = function (s) {
  let smap = new Map();
  let result = 0;
  let odd = 0;
  for (let i = 0; i < s.length; i++) {
    if (!smap.has(s[i])) {
      smap.set(s[i], 1);
    } else {
      smap.set(s[i], smap.get(s[i]) + 1);
    }
  }
  smap.forEach((value) => {
    result += parseInt(value / 2) * 2;
    if (value % 2 !== 0) {
      odd++;
    }
  });
  return odd > 0 ? result + 1 : result;
};

看着更简洁的解题代码(JavaScript)

// 个人还是推荐上面那种解法,更容易理解吧
// 每当达到偶数条件结果就+2,然后从map中移除
// 最后用map的size判断是否需要+1
var longestPalindrome = function (s) {
  let smap = new Map();
  let result = 0;
  for (let i = 0; i < s.length; i++) {
    if (!smap.has(s[i])) {
      smap.set(s[i], 1);
    } else {
      result += 2;
      smap.delete(s[i]);
    }
  }
  result += smap.size > 0 ? 1 : 0;
  return result;
};