每日一题算法:2020年8月29日 [最短回文串](https://leetcode-cn.com/problems/shortest-palindrome/) shortestPalindrome

2020年8月29日 最短回文串 shortestPalindrome

在这里插入图片描述

class Solution {
    public String shortestPalindrome(String s) {

    }
}

解题思路:

我的想法是这样子的,如果一个在一个字符串前面加上几个字符就能组成一个回文串,那么加上的这几个必定是该字符串末尾的几个字符的倒置。那么我们可以把一个字符串拆分成下面这样三个部分。

假设我们有一个字符串,abaca,那么要在前面添加字符让他成为一个回文,这个字符可以拆分为中间的回文部分以及后缀的多余

在这里插入图片描述

然后我们将后缀部分反制作为前缀就可以构成一个回文串。

在这里插入图片描述

那么经过这么一分析,问题就转变为求一个字符串中以开头作为起点的最长回文子串。

那么我们就从末尾开始遍历,删除节点后是否是一个回文串。当得到第一个回文串的时候结束。并且记录最长回文子串的长度。

在这里插入图片描述

思路清晰,但是有点慢。

    char[] chars;
    public String shortestPalindrome(String s) {
        //第一步,找到包含头部的最长子回文串

        //使用数组操作更快
        chars = s.toCharArray();
        int len=s.length();
        for (int i=0;i<len;i++){
            //如果是回文串
            if (isPalindrome(len-i-1)) {

                //新的字符串长度
                char[] res=new char[len+i];

                System.arraycopy(chars,0 ,res ,i,len );
                for (int j=0;j<=i;j++){
                    res[j]=chars[len-j-1];
                }
                
                return new String(res);
            }
        }
        return "";
    }
    public boolean isPalindrome(int index){
        for (int i=0;i<index;i++,index--){
            if (chars[i]!=chars[index]) {
                return false;
            }
        }
        return true;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值