最长回文字符串

class PlalindromeString{
    //判断一个字符串是否为回文串,后面算法用不到
    private boolean isPlalindrome(String s){
        int len = s.length();
        for(int i=0;i<len/2;i++){
            if(s.charAt(i)!=s.charAt(len-1-i)){
                return  false;

            }
        }return  false;
    }

    //对字符串进行预处理,加上#
    private String preHandleString(String s){
        StringBuffer sb = new StringBuffer();
        int len = sb.length();
        sb.append('#');
        for(int i =0;i<sb.length()-1;i++){
            sb.append(s.charAt(i));
            sb.append('#');
        }
        return sb.toString();
    }

    //寻找最长的回文串
    public String findLongestPlalindromesString(String s){
        String str = preHandleString(s);
        int len = str.length();
        //右边界
        int rightSide = 0;
        //右边界对应的的回文串中心
        int rightSideCenter = 0;
        //存下以每个字符为中心的会问长度的一半(向下取整)
        int[] halfLenArr = new int[len];
        //记录回文中心
        int center = 0;
        //记录最长回文长度
        int longestHalf = 0;
        //是否需要中心扩展
        for(int i=0;i<len-1;i++){
            //是否在右边界覆盖范围之内
            boolean needCalc = true;
            if(rightSide>i){
                int leftCenter = 2 * rightSideCenter - i;
                halfLenArr[i] = halfLenArr[leftCenter];
                // 如果超过了右边界,进行调整
                if(i + halfLenArr[i] > rightSide) { //意思是aba的话,arr长度为1,是因为> 8-7 = 1
                    halfLenArr[i] = rightSide - i; //这一行不是很懂
                }
                if(i + halfLenArr[leftCenter] < rightSide) {
                    // 直接推出结论
                    needCalc = false;
                }

            }
            //中心拓展
            if(needCalc){
                while(i - 1 - halfLenArr[i] >= 0 && i + 1 + halfLenArr[i] < len){
                    if(str.charAt(i + 1 + halfLenArr[i]) == str.charAt(i - 1 - halfLenArr[i])){
                        halfLenArr[i]++;
                    }else
                        break;
                }
            }
            //更新右边界和中心
            rightSide = i + halfLenArr[i];
            rightSideCenter = i;
            //记录最长回文串
            if(halfLenArr[i] > longestHalf) {
                center = i;
                longestHalf = halfLenArr[i];
            }
        }

        StringBuffer sb = new StringBuffer();
        for(int i=center-longestHalf+1;i<=center+longestHalf;i+=2){
            sb.append(str.charAt(i));
        }
        return sb.toString();
    }

}
class Main{
    public static void main(String[] args) {
        PlalindromeString ps =new PlalindromeString();

        String[] testStrArr = new String[]{
                "abcdcef",
                "adaelele",
                "cabadabae",
                "aaaabcdefgfedcbaa",
                "aaba",
                "aaaaaaaaa"
        };
        for(String str:testStrArr){
            System.out.println(String.format("原字符:%s",str));
            System.out.println(String.format("最长回文串:%s",ps.findLongestPlalindromesString(str)));
            System.out.println();
        }
    }
}

输出不太对,,在最长回文串后没有输出来东西,,再想想后改回来,上面的是没有错的。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值