动态规划思想实现最长回文子串(c++代码)

思想: 

假设dp[i,j]=1,表示str[i…j]是回文串,dp[i,j]=0表示str[i,j]不是回文串.
if str[i] == str[j] then dp[i,j] = dp[i+1,j-1].
if str[i] != str[j] then dp[i,j] = 0.

代码:

完整代码已上传我的github,项目名DP,其中还有最大公共子序列和最长公共子串的实现:https://github.com/yisun03/DP

LPS.h

//
// Created by yis on 2020/7/12.
//

#ifndef DYNAMIC_PROGRAMMING_LPS_H
#define DYNAMIC_PROGRAMMING_LPS_H

#include 
#include 
#include 

using std::string;
using std::vector;

namespace yis
{
  class LPS
  {
  public:
    // 假设dp[i,j]=1,表示str[i…j]是回文串,dp[i,j]=0表示str[i,j]不是回文串.
    // if str[i] == str[j] then dp[i,j] = dp[i+1,j-1].
    // if str[i] != str[j] then dp[i,j] = 0.
    static string lps(string str);
  };
}



#endif //DYNAMIC_PROGRAMMING_LPS_H

LPS.cpp

//
// Created by yis on 2020/7/12.
//

#include "LPS.h"

namespace yis
{
  string LPS::lps(string str)
  {
    int len = str.length();
    if(len == 0 || len == 1)
    {
      return str;
    }
    // 维护一个动态规划表
    vector> dp_table(len,vector(len));
    // start为回文串起始位置.
    int start = 0;
    // max为回文串最大长度.
    int max = 1;
    // 初始化.
    for(int i = 0; i < len; ++i)
    {
      dp_table[i][i] =1;
      if(i < len - 1 && str[i] == str[i+1])
      {
        dp_table[i][i+1] = 1;
        start = i;
        max = 2;
      }
    }
    // l表示检索的子串长度,先检索长度为3的子串
    for(int l = 3; l < len; ++l)
    {
      for(int i = 0; i+l-1 < len; ++i)
      {
        // j为回文串最后一个字符.
        int j = i+l-1;
        if(str[i] == str[j] && dp_table[i+1][j-1] == 1)
        {
          dp_table[i][j] = 1;
          start = i;
          max = l;
        }
      }
    }
    return str.substr(start,max);
  }
}

main.cpp

//
// Created by yis on 2020/7/12.
//
#include 
#include "LPS.h"

int main()
{
  string str = "cadbdeababababababcde";
  std::cout << "str 的最长回文子串为:\n" << yis::LPS::lps(str) << std::endl;
  return 0;
}

实验结果:

动态规划思想实现最长回文子串(c++代码)_第1张图片

你可能感兴趣的:(代码库,算法,c++)