【leetCode】Shortest Palindrome

本文介绍了一种通过反转字符串结合KMP算法的方法来寻找给定字符串前缀的最长回文子串,并据此构造出最短的回文串。文章详细解释了算法原理并提供了实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:给定一个字符串,在字符串的前面加一些字符,使之成为回文串。返回最短长度的回文串。

解法:一开始看成在字符的每个字母前都可以加了,我说怎么做不出来,看解法有感觉跟我理解的不一样,还以为是解法错了,没想到是我错了。

思路就是看看字符串从0开始最长的回文串是多少,假设s[0~i]是以s[0]开头的最长的回文串,那么要加的字符串为s[i+1~l]的逆序。问题就转换为如何去发现从s[0]开始的最长回文串?

方法一:枚举。这个就不说了,网上有人说java能过,反正我写C会超时。刷题不是为了过,而是为了找更好的方法。好吧,这显然不是最好的方法。

方法二:反转字符串+KMP。设s的反转串为s',先求出s#s'#的next数组,然后最长的长度就是最后一个#的next值。具体为什么我就不说了,网上讲KMP算法的很多,我就不再赘述了。

代码如下:

string shortestPalindrome(string s)
{
    int i,j,k,length=s.length();
    int next[100000];
    string ans="",temp;
    if(length<=1) return s;
    ans+=s;
    ans+="-";
    for(i=length-1;i>=0;i--) ans+=s[i];
    ans+="-";
    j=-1;
    k=0;
    next[0]=-1;
    while(k<ans.length())
    {
        if(j==-1||ans[j]==ans[k])
        {
            j++;
            k++;
            next[k]=j;
        }
        else j=next[j];
    }
    k=next[ans.length()-1];
    temp="";
    for(i=length-1;i>=k;i--) temp+=s[i];
    return temp+s;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值