(注意:我发现最长回文子序列(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. Docker容器里配置计划任务 crontab(DaoCloud+Docker +Laravel5)

    最近项目涉及到一个定时任务的功能,所以去这几天研究了一下 crontab 的使用方法,按照网上的相关教程顺利在自己的电脑上成功开启了这个功能 Laravel + crontab 添加 crontab ...

  2. blg_统考,打印准考证 网页代码!

    <html xmlns="http://www.w3.org/1999/xhtml"><head> <title>打印准考证</title ...

  3. 红帽RHCE培训-课程1笔记目录

    目录 1.环境变量 env 2.man手册mandb;系统日志/var/log/messages 3.重定向和管道> 2> &> | tee 4.mail mail -s 标 ...

  4. 神经网络之反向传播算法(BP)公式推导(超详细)

    反向传播算法详细推导 反向传播(英语:Backpropagation,缩写为BP)是"误差反向传播"的简称,是一种与最优化方法(如梯度下降法)结合使用的,用来训练人工神经网络的常见 ...

  5. SpringBoot启动后自动打开浏览器访问项目

    之前我们用SSM或者SSH进行JAVA WEB开发的时候,IDEA 需要配置Tomcat然后把项目放到tomcat运行,tomcat启动的时候会自动打开浏览器去访问项目,但是SpringBoot是内嵌 ...

  6. Ip2Region IP转化地址位置

    Ip2Region有中文和数据结构支持,是一个很好的第三方ip转换工具. java: <dependency> <groupId>org.lionsoul</groupI ...

  7. JSP技术(一)

    Servlet的两个缺点: 1.首先,写在Servlet中所有的HTML标签必须包含JAVA字符串,使得处理HTTP响应报文工作十分繁琐. 2.所有的文件和HTML标记是硬代码,导致即使是微小变化,也 ...

  8. 消息队列(五) ---RocketMQ-消息存储3

    问题: consumeQueue 如何工作 刷盘机制如何工作 概述 该节我们将学习 consumeQueue 如何工作,先来看一下消息发送的大概过程. 而为什么需要 consumeQueue 的存在呢 ...

  9. TOMCAT中文信息乱码改为GBK

    # Licensed to the Apache Software Foundation (ASF) under one or more# contributor license agreements ...

  10. linux contab

    定义格式: * * * * * commandm(0-59), h(0-23) d(1-31) M(1-12) W(0-7)周W用1-6表示分别对应:每周一….五,六,周日在国外老外周日相当于第一个工 ...