leetcode - Shortest Palindrome

来源:互联网 发布:爱笑会议室解散 知乎 编辑:程序博客网 时间:2024/05/15 23:49

题目:leetcode 

Shortest Palindrome

 

Given a string S, you are allowed to convert it to a palindrome by adding characters in front of it. Find and return the shortest palindrome you can find by performing this transformation.

For example:

Given "aacecaaa", return "aaacecaaa".

Given "abcd", return "dcbabcd".

提示:

从输入字符串的某一位或某两位开始向两边扩展(左右两边的字符相等), 如果能一直扩展到字符串的头部, 则将末尾余下的reverse,再加到原字符串的头部,即可. 


class Solution {public: string shortestPalindrome(string s) {     if(s.size()<=1)        return s;        int size=s.size();    int center= size & 1? (size-1)/2:size/2;    for(int i=center;i>=0;--i)    {        string s1=(i-1>=0 && s[i-1]==s[i])?shortestPalindrome_core(s,i-1,i):"";        string s2=shortestPalindrome_core(s,i,i);        if(!s1.empty() || !s2.empty())        {            if(!s1.empty() && !s2.empty())                return s1.size()>s2.size()?s2:s1;            else                return !s1.empty()?s1:s2;        }    }      }string shortestPalindrome_core(const string &s,int l,int r){    if(l==0)    {        if(r==0)        {            string tmp=s.substr(1,s.size()-1);            reverse(tmp.begin(),tmp.end());            tmp=tmp+s;            return tmp;        }        else        {            string tmp(s.begin()+2,s.end());            reverse(tmp.begin(),tmp.end());            tmp=tmp+s;            return tmp;        }    }        int i=l-1,j=r+1,size=s.size();    //注意 i和j都应该在合理范围内    while(i>=0 && j<size && s[i]==s[j])    {        --i;        ++j;    }    if(i==-1)    {        if(j==s.size())            return s;         string tmp(s.begin()+j,s.end());         reverse(tmp.begin(),tmp.end());         tmp=tmp+s;        return tmp;    }    else        return "";}};



最优的解法,见 这里。


0 0
原创粉丝点击