zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    linq 读取xml
    c# 定时器 自动执行
    如何在一个人输入框中只输入数字
    如何去掉滚动条,
    如何计算任意值之间的随机数呢
    【P2387】魔法森林(SPFA非正解)
    【Luogu】P3203弹飞绵羊(分块)
    【Luogu】P3396哈希冲突(根号算法)
    【Luogu】P2801教主的魔法(分块)
    【Luogu】P3155叶子的染色(树形DP)
  • 原文地址:https://www.cnblogs.com/fanhaha/p/7157308.html
Copyright © 2011-2022 走看看