算法练习笔记(十)——动态规划之回文子列的查找
来源:互联网 发布:淘宝点击率是什么意思 编辑:程序博客网 时间:2024/06/05 03:15
动态规划将一个看似复杂的问题分解为一个个小问题,从而达到简化过程的目的
而最大回文子列的查找为其中典型
并让我们感受到很多问题只要寻找到其中本质,便能够直接地将之解出来
主要思路便是:
对于任意字符串,如果头尾字符相同,那么字符串的最长子序列等于去掉首尾的字符串的最长子序列加上首尾;如果首尾字符不同,则最长子序列等于去掉头的字符串的最长子序列和去掉尾的字符串的最长子序列的较大者。
题目地址:https://leetcode.com/problems/longest-palindromic-subsequence/#/description
题目:Longest Palindromic Subsequence
描述:
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
也就是在给定的一串字符中,找出其中能够回文的最长子列并输出长度在自己的解法上,我直接地运用了string结构所带函数辅助解答
class Solution {public: int longest(string s){ int size = s.size(); if(size == 1)return 1; if(s[0] == s[size - 1]){ if(size == 2)return 2; s.pop_back(); s.erase(0, 1); return 2 + longest(s); } if(s[0] != s[size - 1]){ if(size == 2)return 1; string n = s; s.pop_back(); n.erase(0, 1); return max(longest(n), longest(s)); } } int longestPalindromeSubseq(string s) { return longest(s); }};然而由于erase和pop函数所耗费的时间太多,并不是最效率解
于是借鉴了leetcode中分享的解法:https://leetcode.com/problems/longest-palindromic-subsequence/#/solutions
class Solution {public: //lhs means left hand side, rhs means right hand side int longestPalindromeSubseq(string s) { if (s.empty()) return 0; vector<vector<int>> longest(s.size(), vector<int>(s.size())); for (int len=1; len<=s.size(); len++) { for (int lhs=0; lhs+len<=s.size(); lhs++) { int rhs = lhs+len-1; if (lhs == rhs) { longest[lhs][rhs] = 1; } else if (lhs+1 == rhs) { longest[lhs][rhs] = (s[lhs] == s[rhs]) ? 2 : 1; } else { int add = s[lhs] == s[rhs] ? 2 : 0; longest[lhs][rhs] = max(max(longest[lhs][rhs-1], longest[lhs+1][rhs]), longest[lhs+1][rhs-1] + add); } } } return longest[0].back(); }};
其中巧妙地运用了容器的二维数组,将s中i到j间最大子列长度收入v[s][j]中,方便查找。
0 0
- 算法练习笔记(十)——动态规划之回文子列的查找
- 算法导论——动态规划之最长公共子序列(LCS)和最长回文子序列(LPS)
- 算法导论 动态规划之最长回文子序列
- 算法练习笔记(十一)— 动态规划之分解问题
- 最长回文子串—动态规划和Manacher算法(0(n)时间复杂度
- 算法导论学习笔记(10)——动态规划之最优二叉查找树
- 算法导论学习笔记(9)——动态规划之最长公共子序列
- 最长公共子序列和回文字符串 动态规划 小白算法练习
- 动态规划之最长回文子序列
- 算法笔记——【动态规划】最大子段和
- Stereo Matching文献笔记之(十):经典算法Semi-Global Matching(SGM)之碉堡的动态规划~
- Stereo Matching文献笔记之(十):经典算法Semi-Global Matching(SGM)之碉堡的动态规划~
- Stereo Matching文献笔记之(十):经典算法Semi-Global Matching(SGM)之碉堡的动态规划~
- 动态规划——最长回文子序列
- 统计回文子序列(动态规划)
- 回文子串(动态规划)
- 最长公共子序列LCS和最长回文子序列的动态规划算法
- 《算法导论》学习笔记(5)——动态规划:最长子序列
- 【C】用VS编写C程序
- 面试常考之排序算法
- 西加云杉700E设备AAA认证之Portal服务器与AC的交互
- JavaBean规范
- maven配置和更新本地库
- 算法练习笔记(十)——动态规划之回文子列的查找
- 西加云杉700E设备AAA认证之Radius服务器与AC的交互
- Git代码管理终极简单使用篇
- HDU 3605 Escape (二分图多重匹配模板)
- 服务器搭建日志之ftp服务器
- mac myeclipse 控制台乱码
- 西加云杉700E设备AAA认证之Radius服务器与Mysql数据库交互
- java获取当前时间
- 常用排序算法总结