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

文章讲述了如何使用Java编程解决字符串中回文串的问题,通过统计字符出现次数,利用奇数次字符作为回文串中间的规则,计算出最长回文串的长度。作者提供了Solution类中的`longestPalindrome`方法实现这一算法。
摘要由CSDN通过智能技术生成
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,
    }
}
  • 13
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

殷丿grd_志鹏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值