LPS(最长回文子序列)
(注意:我发现最长回文子序列(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(最长回文子序列)的更多相关文章
- 最长回文子序列(LPS)
问题描述: 回文是正序与逆序相同的非空字符串,例如"civic"."racecar"都是回文串.任意单个字符的回文是其本身. 求最长回文子序列要求在给定的字符串 ...
- 动态规划求一个序列的最长回文子序列(Longest Palindromic Substring )
1.问题描述 给定一个字符串(序列),求该序列的最长的回文子序列. 2.分析 需要理解的几个概念: ---回文 ---子序列 ---子串 http://www.cnblogs.com/LCCRNblo ...
- NOIP2016提高组初赛(2)四、读程序写结果3、求最长回文子序列
#include <iostream> using namespace std; int lps(string seq, int i, int j) { int len1, len2; i ...
- 最长回文子序列LCS,最长递增子序列LIS及相互联系
最长公共子序列LCS Lintcode 77. 最长公共子序列 LCS问题是求两个字符串的最长公共子序列 \[ dp[i][j] = \left\{\begin{matrix} & max(d ...
- [LeetCode] Longest Palindromic Subsequence 最长回文子序列
Given a string s, find the longest palindromic subsequence's length in s. You may assume that the ma ...
- [Swift]LeetCode516. 最长回文子序列 | Longest Palindromic Subsequence
Given a string s, find the longest palindromic subsequence's length in s. You may assume that the ma ...
- HDU 4745 Two Rabbits ★(最长回文子序列:区间DP)
题意 在一个圆环串中找一个最长的子序列,并且这个子序列是轴对称的. 思路 从对称轴上一点出发,向两个方向运动可以正好满足题意,并且可以证明如果抽选择的子环不是对称的话,其一定不是最长的. 倍长原序列, ...
- Leetcode 516.最长回文子序列
最长回文子序列 给定一个字符串s,找到其中最长的回文子序列.可以假设s的最大长度为1000. 示例 1:输入: "bbbab" 输出: 4 一个可能的最长回文子序列为 " ...
- 简单动态规划——最长公共子序列&&最长回文子序列&&最长上升||下降子序列
最长公共子序列,顾名思义当然是求两个字符串的最长公共子序列啦,当然,这只是一道非常菜的动规,所以直接附上代码: #include<iostream> #include<cstdio& ...
随机推荐
- Travel in desert
传送门 不算难吧 应该有思路的 还是太水了吧 (而且和货车运输很像的啊 ---------------------------------------------------------------- ...
- MyBatis学习总结(一)--mybatis快速入门
一.Mybatis介绍 MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装.MyBatis可以 ...
- 吴裕雄 python 神经网络——TensorFlow 完整神经网络样例程序
import tensorflow as tf from numpy.random import RandomState batch_size = 8 w1= tf.Variable(tf.rando ...
- python调用c++开发的动态库
此处列举一下python调用Windows端动态库. # *- coding=utf-8 -* import ctypes from ctypes import * import os objdll ...
- 安卓之视图View的基本属性
一.在xml布局文件中常用的属性定义 (1) id:指定该视图的编号 (2) layout_width:指定该视图的宽度可以是具体的dp值:可以是match_parent,表示与上级视图一 ...
- Spring扫描组件的使用详解
https://blog.csdn.net/you18131371836/article/details/53691044?utm_source=blogxgwz5
- 腾讯云Windows Server下nodejs websocket ssl配置
1.从腾讯云申请SSL证书,下载解压,得到如下文件: 2.nodejs代码: // wss.js const fs = require('fs'); // 一些配置信息 const cfg = { p ...
- 忘记SYS密码
进入控制台录入 sqlplus /nolog; connect / as sysdba alter user sys identified by ; alter user system ident ...
- Kafka .net 开发入门
Kafka安装 首先我们需要在windows服务器上安装kafka以及zookeeper,有关zookeeper的介绍将会在后续进行讲解. 在网上可以找到相应的安装方式,我采用的是腾讯云服务器,借鉴的 ...
- python学习笔记:分支 与 循环
if 语句 if 条件: ...... # 条件为真的时候,执行缩进的代码 if 条件: ...... # 条件为真的时候执行 else: ...... # 条件为假的时候执行 if 条件1: ... ...