(注意:我发现最长回文子序列(Longest Palindromic Subsequence)问题与最长回文子串(Longest Palindromic Substring)不一样,子序列不要求下标一定连续的,但子串下标一定是连续递增的,《算法导论》中要求的是最长回文子序列,所以与LeetCode-Longest Palindromic Substring不同,这里我做的是书中的问题)

  这里对最优子结构和算法参考思路:

http://blog.csdn.net/u012243115/article/details/41010913

  代码:

#include "stdafx.h"
#include <iostream>
#include <vector>
#include <string>
#include <minmax.h> class Solution {
public:
int LongestPalindromicSubsequence(std::string s)
{
if (s.empty())
return 0; std::vector<std::vector<int> > dp(s.size(), std::vector<int>(s.size()));
int LPSLength = 1;
for (int i = s.size() - 1; i >= 0; i--)
{
dp[i][i] = 1;
for (int j = i + 1; j < s.size(); j++)
{
if (s[i] == s[j])
dp[i][j] = dp[i + 1][j - 1] + 2;
else
dp[i][j] = max(dp[i + 1][j], dp[i][j - 1]);
LPSLength = max(LPSLength, dp[i][j]);
}
}
return LPSLength;
}
}; int main()
{
std::vector<std::string> strs = { "character","inileveltnt","bilibili","abcef","rever" }; for (auto s : strs)
{
std::cout << "字符串:" << s << std::endl;
std::cout << "结果:" << Solution().LongestPalindromicSubsequence(s) << std::endl;
} getchar();
return 0;
}

  LeetCode上的提交详情:

  改成这样就提高到了51ms:

class Solution {
public:
int longestPalindromeSubseq(string s) {
if (s.empty())
return 0; vector<vector<int> > dp(s.size(), vector<int>(s.size()));
for (int i = s.size() - 1; i >= 0; i--)
{
dp[i][i] = 1;
for (int j = i + 1; j < s.size(); j++)
{
if (s[i] == s[j])
dp[i][j] = dp[i + 1][j - 1] + 2;
else
dp[i][j] = max(dp[i + 1][j], dp[i][j - 1]);
}
}
return dp[0][s.size() - 1];
}
};

  提交详情:

  还有更快的22ms的解决方案:

class Solution {
public:
int longestPalindromeSubseq(string s) {
if (s.size() == 0) return 0;
vector<int> dp(s.size(), 0);
for (int i = s.size() - 1; i >=0; i--) {
int prev = 1;
for (int j = i + 1; j < s.size(); j++) {
int curr;
if (s[i] == s[j]) curr = 2 + dp[j - 1];
else curr = max(prev, dp[j]);
dp[j - 1] = prev;
prev = curr;
}
dp[s.size() - 1] = prev;
}
return dp[s.size() -1];
}
};

  也是dp思路,但空间复杂度优化为O(n)。

LPS(最长回文子序列)的更多相关文章

  1. 最长回文子序列(LPS)

    问题描述: 回文是正序与逆序相同的非空字符串,例如"civic"."racecar"都是回文串.任意单个字符的回文是其本身. 求最长回文子序列要求在给定的字符串 ...

  2. 动态规划求一个序列的最长回文子序列(Longest Palindromic Substring )

    1.问题描述 给定一个字符串(序列),求该序列的最长的回文子序列. 2.分析 需要理解的几个概念: ---回文 ---子序列 ---子串 http://www.cnblogs.com/LCCRNblo ...

  3. NOIP2016提高组初赛(2)四、读程序写结果3、求最长回文子序列

    #include <iostream> using namespace std; int lps(string seq, int i, int j) { int len1, len2; i ...

  4. 最长回文子序列LCS,最长递增子序列LIS及相互联系

    最长公共子序列LCS Lintcode 77. 最长公共子序列 LCS问题是求两个字符串的最长公共子序列 \[ dp[i][j] = \left\{\begin{matrix} & max(d ...

  5. [LeetCode] Longest Palindromic Subsequence 最长回文子序列

    Given a string s, find the longest palindromic subsequence's length in s. You may assume that the ma ...

  6. [Swift]LeetCode516. 最长回文子序列 | Longest Palindromic Subsequence

    Given a string s, find the longest palindromic subsequence's length in s. You may assume that the ma ...

  7. HDU 4745 Two Rabbits ★(最长回文子序列:区间DP)

    题意 在一个圆环串中找一个最长的子序列,并且这个子序列是轴对称的. 思路 从对称轴上一点出发,向两个方向运动可以正好满足题意,并且可以证明如果抽选择的子环不是对称的话,其一定不是最长的. 倍长原序列, ...

  8. Leetcode 516.最长回文子序列

    最长回文子序列 给定一个字符串s,找到其中最长的回文子序列.可以假设s的最大长度为1000. 示例 1:输入: "bbbab" 输出: 4 一个可能的最长回文子序列为 " ...

  9. 简单动态规划——最长公共子序列&&最长回文子序列&&最长上升||下降子序列

    最长公共子序列,顾名思义当然是求两个字符串的最长公共子序列啦,当然,这只是一道非常菜的动规,所以直接附上代码: #include<iostream> #include<cstdio& ...

随机推荐

  1. js中的文本编辑器控件KindEditor

    使用文本编辑器控件KindEditor渲染文本域页面显示 this.sync()同步KindEditor的值到textarea文本框 editor.isEmpty()判断文本域是否是空 editer. ...

  2. 超好用的免费Redis客户端

    Redis这款基于内存的键值对(key-vlaue)数据库,自带了一个基于命令行式的管理工具redis-cli,但是使用起来并不方便.虽然现在有了许多的图形化管理工具,有些需要收费,有些不好用.最终还 ...

  3. Linux新建SVN版本库

    1.进入svn 版本库(如/www/svn) 2.创建svn 版本库svnadmin create  edition 3.进入新建的版本库库目录cd edition 4.进入版本库配置目录cd con ...

  4. 【MySQL】外键的变种

    " 目录 三种关系 多对一 多对多 一对一 因为有foreign key的约束,使得两张表形成了三种关系: 多对一 多对多 一对多 重点理解如何找出两张表之间的关系 现在有A.B两张表 分析 ...

  5. 使用PIE.htc 进行IE兼容CSS3

    步骤: 1.引入文件.注意PIE.htc文件和css文件要放在同一个目录下: 2.在css元素中加上  behavior:url(pie.htc); 3.可以愉快的写css hack啦 ,这时需要的圆 ...

  6. Django模板及路由的配置

    学习内容: (1)路由的配置 (2)模板的介绍 (3)模板显示数据 一.路由的配置 以上一篇文章的名字Booketest项目,有一个子模块demo1进行讲解. 1.首先在Booktest项目下的同名子 ...

  7. 局域网内Linux下开启ftp服务的“曲折路”和命令复习

    今天主要学习了Linux下网络配置以及vsftp(FTP)和samba的服务配置,学习起来,难度也就一般,并没有特别难,可是在可以做实验的时候,却并没有自己想像的那么顺利,可见,很多事情看起来不难,做 ...

  8. Informatica PowerCenter 常用转换组件一览表

    原文地址:https://blog.csdn.net/yongjian1092/article/details/52176018 转换类型: 积极转换(Active):可以更改通过它来传递的数据行数, ...

  9. ZOJ4117 BaoBao Loves Reading(2019山东省赛)

    按照计划读书,第i分钟要读第ai本书,起初桌子是空的,所有书都在书架上,如果要读的书不在桌子上,就需要把书从书架上拿到桌子上,如果桌子已经满了,则需要先把桌子上最早读的一本书放回书架,求当桌子容量为k ...

  10. MQTT 浏览器 mqttws31.min.js

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...