求解最大回文串的长度

回文串

(就是和高中语文提到过的有种诗叫回文诗是一样的本质,正读和反读都一样)

给定一个包含大小写的字符串,算出最长回文串的长度

/*回文串
* 给定一个包含大小写的字符串找,算出最长回文串的长度*/

import java.util.HashSet;

/*给定一个包含大写字母和小写字母的字符串,找到通过这些字母构成字母的最长回文串,在构造的过程中,注意区分大小写
* 比如Aa不能作为一个回文字符串
* 注意假设字符串的长度不会超过1010*/
public class soultion {
/*回文串是一个正读和反读都一样的字符串,比如level或者noond等就是回文串*/

    /*示例:abccccdd*/

    /*输出:7*/

    /*解释我们可以构造的最长回文串是dccaccd,他的长度是7*/

    /*思考可以构成回文串的两种情况
    *字符出现次数为双数的组合
    * 字符出现次数为双数的组合+一个只出现一次的字符串
    * */

    /*核心:统计字符出现的次数即可,双数才能构成回文,因为允许中间一个数单独出现比如“abcba”所以如果
    最后有字母落单,总长度可以加1
    *
    * */

    /*步骤:
    * 首先将字符串转换为字符数组
    * 遍历该数组
    * 对应字符是不是在hashSet中,如果不在加进去,如果在就让count++,然后移除该该字符,这样就能找到字符出现次数为双数的
    * 字符个数*/
    public static void main(String[] args) {
        String s="aba";
        soultion soultion=new soultion();
        int i = soultion.longestPalifindrome(s);
        System.out.println(i);
    }


    /*这个方法传入一个String类型的字符串*/
public int longestPalifindrome(String s){
    //首先判断这个字符串是不是长度为0
if(s.length()==0){
    return 0;
}

    //创建一个hashset来存放字符
    //为什么要用hashset来存储呢  下面解答
    //这个hashset里面存储了一个character  这是个包装类类型   集合里面要存储包装类类型 ,他是个对象
    // 这也是包装类类型存在的意义
    HashSet<Character> hashset=new HashSet<Character>();

   //传进来的字符串转换为一个字符数组来存储
    char[] chars = s.toCharArray();

    //定义一个计数器
    int count=0;
    //遍历字符数组中的每一个元素
    for (int i = 0; i <chars.length ; i++) {
        //如果集合中的元素和char数组里面的元素不相等  就把char数组里面的元素加入到hashset中


        //hashset存在就是为了这个方法
        if(!hashset.contains(chars[i])){
            //元素不相等就加入hashset
            hashset.add(chars[i]);



        }else {
            //元素相等就移除这个元素
            hashset.remove(chars[i]);
           //实际上这个count才是关键

            count++;//并把计数器加加
        }

    }
    //判断hashset是不是空的   是空的  count*2  不是空的count*2+1;


    //这样就可以把最长回文串的长度求出来

    //有点像打牌里面的摸乌龟打打法。
return hashset.isEmpty()?count*2:count*2+1;
}
}

总结:将军始于卒伍,多练。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值