• Leetcode 之Longest Palindromic Substring(30)


    很经典的一道题,最长回文子串,有多种方法。

    首先介绍的一种方法是从中间向两边展开。注意区分aba和abba型的回文串;如果当前最长的子串已经当于两边中最长的子串了,则无需再去判断。

    //从中间向两边展开
          string expandAroundCenter(string s, int c1, int c2)
          {
              int l = c1, r = c2;
              int n = s.length();
    
              while (l >= 0 && r <= n - 1 && s[l] == s[r])
              {
                  l--;
                  r++;
              }
              return s.substr(l + 1, r - l - 1);
          }
    
          string longestPalindString(string s)
          {
              int n = s.length();
              if (n == 0)return s;
    
              string longest = s.substr(0, 1);
              int mid = n / 2;
              //
              for (int i = 0; i < n - 1; i++)
              {
                  //如果剩下的字串长度已经小于当前最大长度字串的长度,则无需再比较
                  if (2 * (mid - i + 1) < longest.length() && 2 * (n - mid - i)<longest.length())
                      break;
                  //如果是aba型的回文串
                  string p1 = expandAroundCenter(s, mid+i, mid+i);
                  if (p1.length()>longest.length())
                      longest = p1;
    
                  string p2 = expandAroundCenter(s, mid - i, mid - i);
                  if (p2.length()>longest.length())
                      longest = p2;
                  //如果是abba型的回文串
                  string p3 = expandAroundCenter(s, mid+i, mid+i + 1);
                  if (p3.length()>longest.length())
                      longest = p3;
    
                  string p4 = expandAroundCenter(s, mid - i, mid - i - 1);
                  if (p4.length()>longest.length())
                      longest = p4;
              }
    
              return longest;
          }
    View Code

     还有一种动态规划的方法,第一次接触,还需慢慢理解。

    string longestPalindString(string s)
          {
              const int n = s.size();
              bool f[n][n];
    
              fill_n(&f[0][0], n*n, false);
    
              int max_length = 1, start = 0;
    
              for (int i = 0; i < n; i++)
              {
                  f[i][i] = true;
                  for (int j = 0; j < i; j++)
                  {
                      f[j][i] = (s[j] == s[i] && (i - j < 2 || f[j + 1][i - 1]));
                      if (f[j][i] && max_length < (i - j + 1))
                      {
                          max_length = i - j + 1;
                          start = j;
                      }
                  }
              }
              s.substr(start, max_length);
          }
    View Code
  • 相关阅读:
    overflow:hidden三个作用
    git提交代码步骤以及创建issue事项
    Vue3.0中setup函数的使用
    样式rpx
    js函数
    数据类型
    进制转换
    事件绑定
    微信小程序基础
    “AI+”改变世界!不同领域的5大人工智能趋势
  • 原文地址:https://www.cnblogs.com/573177885qq/p/5523466.html
Copyright © 2020-2023  润新知