Longest Palindromic Subsequence
来源:互联网 发布:期货历史五分钟数据 编辑:程序博客网 时间:2024/05/14 09:02
一. Longest Palindromic Subsequence
You are given two non-empty linked lists representing two non-negative
Given a string s, find the longest palindromic subsequence’s length in s. You may assume that the maximum length of s is 1000.
Example 1:
Input:
“bbbab”
Output:
4
One possible longest palindromic subsequence is “bbbb”.
Example 2:
Input:
“cbbd”
Output:
2
One possible longest palindromic subsequence is “bb”.
Difficulty:Medium
TIME:30MIN
解法
由于之前做过一道题,是求最长回文子串Longest Palindromic Substring,复杂度为
因此,要采用其他的解法,这里用的是动态规划。动态规划首先就是找到问题的最优子结构,而对于回文序列来说,最优子结构可采用如下方式表示:
令
- 如果
xi=xj ,那么L[i][j]=L[i+1][j−1]+2 - 如果
xi!=xj ,那么L[i][j]=max(L[i][j−1],L[i+1][j])
这就是最长回文子串的最优子结构,代码如下:
int longestPalindromeSubseq(string s) { if(s.size() == 0) return 0; int dp[1001][1001] = {0}; for(int i = 0; i < s.size(); i++) dp[i][i] = 1; /* 这里的i是指字符之间的间隔,间隔应当从1开始,也就是先把所有的长度为2的子串求得最长回文子串 当然i也可以表示位置,但要从字符串的尾部开始遍历,这样保证需要的子问题都能求得结果 */ for(int i = 1; i < s.size(); i++) { for(int j = 0; j < s.size() - i; j++) { if(s[j] == s[j + i]) dp[j][j + i] = dp[j + 1][j + i - 1] + 2; else dp[j][j + i] = max(dp[j + 1][j + i], dp[j][j + i - 1]); } } return dp[0][s.size() - 1];}
代码的时间复杂度为
总结
动态规划最重要的就是要找到问题的最优子结构,因此必须得对问题有比较好的洞察力。首先就是要找到切分问题的方法,然后再看这样切分问题是否是最优子结构。一但找到最优子结构,那么处理问题就会方便很多。
- Longest Palindromic Subsequence
- PIQ07: Longest Palindromic Subsequence
- leetcode_middle_42_516. Longest Palindromic Subsequence
- 516. Longest Palindromic Subsequence
- 516 Longest Palindromic Subsequence
- 516. Longest Palindromic Subsequence
- 516. Longest Palindromic Subsequence
- Longest Palindromic Subsequence
- 516. Longest Palindromic Subsequence
- Lettcode_516. Longest Palindromic Subsequence
- 516. Longest Palindromic Subsequence
- 516. Longest Palindromic Subsequence
- leetcod_516. Longest Palindromic Subsequence
- Longest Palindromic Subsequence
- leetcode516. Longest Palindromic Subsequence
- 516. Longest Palindromic Subsequence
- Longest Palindromic Subsequence
- 【516】 Longest Palindromic Subsequence
- LeetCode 289. Game of Life
- Method Swizzling的应用
- XML约束之DTD
- hdu 1466 计算直线的交点数(递推+数学)
- 操作系统ICMP TTL
- Longest Palindromic Subsequence
- 《C++Primer》读书笔记(七)类
- 蚂蚁分类信息系统 5.8 图解微信支付参数配置
- Ubuntu14.04下静态编译Qt
- LeetCode #53: Maximum Subarray
- bzoJ2661 连连看(网络流)
- csp2016 12压缩编码
- tensorflow学习笔记(三十六):learning rate decay
- Verilog HDL 定点数探索实验(加&乘)