C++ 防止遗忘 记录一下

  • 中心扩充求最长回文子串

  • 思路:
    选取字符串中的一个字符,向左和向右扩充,如果左右相等则记录长度,继续相等继续记录长度,不相等则返回最后的长度就是最长的;
    字符串长度可能是奇数,也可能是偶数,所以分两种情况扩充:取一个中心元素 & 取两个中心元素
    注意:记录长度时,len = j - i + 1不能犯在i--与j++后面,否则会出错,如i先减到-1了,j-i长度反而增加了
    (记住:相等就先记录长度,再去改变i j)

    class Solution {
    public:
      //扩充后,返回长度
      int extend(string& A,int i,int j,int n){
          int len = 0;
          while(i>=0&&j<n&&A[i]==A[j]){
              //相等则记录长度
              len = j-i+1;
              //记录长度后再去改变i j
              i--;
              j++;
    
          }
          return len;
      }
      int getLongestPalindrome(string A, int n) {
          // write code here
          if(A.size()<=1){
              return 1;
          }
          int max_len = 0;
          for(int i=0;i<n;i++){
              //有两种情况
              //一个中间元素
              int len1 = extend(A,i,i,n);
              //两个中间元素
              int len2 = extend(A,i,i+1,n);
              //先求出这两种情况的最大值
              int tmp = len1>len2?len1:len2;
              //再记录与先前记录最大值max_len二者中较大的
              max_len = max(max_len,tmp);
          }
          //返回最大的
          return max_len;
    
      }
    };