leetCode- Longest Palindromic Substring

判断回文(recursive)

两个条件:

  1. 终止条件,当字符串长度为1或0时,肯定为回文
  2. 当字符串s长度大于1时, s回文的条件是  s[s.begin()+1,s.end()-1]回文并且  *s.begin()==*s.end()
bool ishuiwen(string s)
{
    if(s.size()<=1)
     return true;
    string s1=s.substr(1,s.size()-2);
    bool issub=ishuiwen(s1);
    if(*s.begin()==*(s.end()-1)&&issub==true)
        return true;
    else
        return false;

}

string中*s.end() 是‘’. 

不使用递归:

bool ishuiwen2(string s)
{
   for(int i=0;i<s.size()/2;i++)
   {
          if(s[i]!=s[s.size()-i-1])
    return false;
   }
 return true;


}

得到最长的子回文字符串,最简单的做法得到所有字符串是否回文,记录长度,比较得到最长的。

string longstr(string s)
{
    bool is;
    int nowl=1;
    int longl=1;
    string longsub;
    string s1;
    for(int i=0;i<s.size();i++)
    {
        for(int  j=i+1;j<=s.size();j++)
        {
          s1=s.substr(i,j-i);
          cout<<s1<<endl;
          is=ishuiwen2(s1);
           if(is)
            nowl=s1.size();
            cout<<nowl<<endl;
            cout<<longl<<endl;
            cout<<longsub<<endl;
            if(nowl>longl)
            {
                 longl=nowl;
                 longsub=s1;
            }


        }
    }
    return longsub;
}

要进行两次循环,时间复杂度高。O(n^3);

改进中心扩展法:

字符串可能为奇数个或偶数个,奇数个时从一个中心点扩展,偶数个时从两个中心点扩展向左右扩展。O(n^2);

string longstr2(string s)
{
    string subl;
    int maxl=0;
    int nowl=1;
    int left;
    int right;
    for(int i=0;i<s.size();i++)
    {
      //  if(s.size()%2==1)
        {
             left=i-1;
         right=i+1;
         nowl=1;
        }
       // else


        while(left>=0&&right<=s.size()&&s[left]==s[right])
        {
            left--;
            right++;
            nowl+=2;
        }
        if(nowl>maxl)
        {
            maxl=nowl;
            subl=s.substr(left+1,right-left-1);
            cout<<nowl<<endl;
            cout<<subl<<endl;

        }
        {
         left=i;
         right=i+1;
         nowl=0;
        }
        while(left>=0&&right<=s.size()&&s[left]==s[right])
        {
            left--;
            right++;
            nowl+=2;
        }
        if(nowl>maxl)
        {
            maxl=nowl;
            subl=s.substr(left+1,right-left-1);
            cout<<nowl<<endl;
            cout<<subl<<endl;

        }
    }
    return subl;
}
原文地址:https://www.cnblogs.com/fanhaha/p/7157308.html