ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

java数据结构与算法刷题-----LeetCode409. 最长回文串

2026/9/23 0:55:50 拓冰建站 浏览量
java数据结构与算法刷题-----LeetCode409. 最长回文串
java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846

在这里插入图片描述

解题思路
  1. 我们来看一个字符串abccccddd可以组成的所有回文串,dccaccd,cdcacdc,ccdadcc,dccbccd,cdcbcdc,ccdbdcc,ccdddcc,cdcdcdc,dccdccd
  2. 你会发现,中间位置的字符,是出现奇数次的字符,而且如果有多个出现奇数次的,例如这里出现奇数次的字符有a,b和d。那么只能选一个作为中间的
  3. 而对于奇数次的字符
  1. 出现一次的,它只能作为回文串中间字符
  2. 出现3次及以上的,比如上面例子中的d,它可以分一个出来做中间的,其余偶数个放到两边。也可以不分一个出来,仅仅去掉一个剩余的偶数个放两边
  1. 而对于偶数次的字符

想要组成最长情况下,必须全放两边。

  1. 因此,我们可以得到这样一个公式,回文和=偶数和+奇数减1后之和+1,其中+1是回文串中间的那个。奇数减一后之和是因为:除了中间那个+1的,其余字符都必须偶数个。

回文串长度 = 出现偶数次的字符个数 + 出现奇数次(>=3)-1 + 1(放到中间的字符,也就是出现奇数次(1次或3次以上)的,挑一个放到中间)

  1. 而对于字符出现次数,可以使用hash表统计出现次数。但是题目给的字符范围比较小,只包含大小写字母,所以可以用数组来代替hash表,使用ASCII码最多只需128个空间,就可以代表所有情况。
代码

在这里插入图片描述

class Solution {public int longestPalindrome(String s) {char[] ch=s.toCharArray();int count[]=new int[128];//先哈希统计for(int i=0;i<ch.length;i++){count[ch[i]]++;}int ans=0;int js = 0;//回文和=偶数和+奇数减1后之和+1,其中+1是回文串中间的那个。奇数减一后之和是因为:除了中间那个+1的,其余字符都必须偶数个for(int i=0;i<128;i++){if(count[i]%2==0){//偶数和ans+=count[i];}else{//奇数情况:一种是当前字符出现次数为1,那么整个回文串,只能有1个出现次数为1的字符,它位于回文串的中间js=1;//+1//第二种是出现次数>3的字符,js已经保存了中间的单个字符,那么剩余的奇数个字符,都只保留偶数个if(count[i]>=3){ans+=count[i]-1;//奇数减1后之和,也就是保留偶数个}}}return ans+js;//回文和=偶数和+奇数减1后之和+1,}
}