Leetcode409. 最长回文串

本文详细解析了LeetCode第409题“最长回文串”的解决方案,介绍了两种方法:一是利用ASCII表统计字符频率,二是使用HashMap进行优化。文章深入探讨了如何通过统计字符出现的次数,找到构成最长回文串的有效策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Leetcode409. 最长回文串

题目:
给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串。
在构造过程中,请注意区分大小写。比如 “Aa” 不能当做一个回文字符串。
注意:
假设字符串的长度不会超过 1010。
示例 1:

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

题解:
方案一:使用ASCII表,英文字母大小写总共占有58个字符,统计字符串中的每个字符出现的次数,放在数组中,再判断每个字符出现的次数有多少个2的倍数,再乘以2,最后求和;如果字符是奇数个,那么再加1。
方案二:使用map,原理同上,只是将数组换成hashMap.
scala代码:

 /**
    * 使用ASCII表方式
    *
    * @param s
    * @return
    */
  def longestPalindrome(s: String): Int = {

    val arr = new Array[Int](58)
    //对于字符串中的每一个字符,在数组中值变为1,没有的字符为0
    for (i <- 0 until s.length) {
      arr(s.charAt(i) - 'A') = arr(s.charAt(i) - 'A') + 1
    }

    var count = 0

    for (num <- arr) {
      count = count + num / 2 * 2
      //如果字符个数为奇数,在计算count最后加上1
      if (num % 2 == 1 && count % 2 == 0) {
        count = count + 1
      }
    }
    count
  }

  /**
    * 借助map来实现
    *
    * @param s
    * @return
    */
  def longestPalindrome2(s: String): Int = {

    val map = new mutable.HashMap[Char, Int]()
    for (char <- s.toCharArray) {
      map.put(char, map.getOrElse(char, 0) + 1)
    }
    var count = 0

    for (num <- map.values) {
      count = count + num / 2 * 2
      //如果字符个数为奇数,在计算count最后加上1
      if (num % 2 == 1 && count % 2 == 0) {
        count = count + 1
      }
    }
    count
  }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值