技术标签: 算法 leetcode与算法 贪心算法 数据结构与算法 动态规划
前篇:
(1)初识动态规划
传送门:
https://leetcode.cn/problems/longest-palindromic-substring/description/
给你一个字符串 s,找到 s 中最长的回文子串。
s ="babab”
结果:“babab”
解析,这是一道典型的动态规划的问题,但是如果你不知道动态规划,你会怎么做 ?
你可能会想到:依次截取字符串s中的每一个子字符串,然后每一次都比较这个子字符串是不是回文的,并且记录字串最大长度和起始下标,这样做固然可以。
但是!! 它的时间复杂度会非常高,把字符串切成每一种不同的字符串,仅仅 “babab” 这五个长度的字符串就有这些可能性,我们需要每次都判断它是否是回文字符串,并且记录,这对于leetcode的测试案例来说是不可能完成的!
他的时间复杂度是O(n^3),在check判断回文里还需要进行一次完整的遍历。因此这种方式是不要可行的。
b
ba
bab
baba
babab
a
ab
aba
abab
b
ba
bab
a
ab
b
完整代码如下:
class Solution {
public:
bool check(string s)
{
int left=0,right=s.size()-1;
while (left<right)
{
if (s[left++]!=s[right--])
{
return false;
}
}
return true;
}
string longestPalindrome(string s) {
int len=0;
int max_len=0;
int start=0;
for (int i=0;i<s.size();i++)
{
len=1;
for (int j=i;j<s.size();j++)
{
string temp=s.substr(i,len);
if (check(temp))
{
if (len>max_len)
{
max_len=len;
start=i;
}
}
len++;
}
}
return s.substr(start,max_len);
}
};
既然是回文串,那么我们不妨想一想回文串有什么性质呢?
以 “babab” 为例。
如果它是回文串,并且长度大于 2,那么将它首尾的两个字母去除之后,它仍然是个回文串: aba是回文串 —> babab 也是回文串,因为首位两个b也相等。
我们可以用 P(i,j)表示字符串s中 从 i 到 j 的字符组成的串,用s[i : j]表示这个串。
P(i,j)可以表示两种情况:
其中false非法的的情况又分为这两种情况:
状态转移方程:
P(i,j)=P(i+1,j-1)+ (s[i] == s[j])
也就是说:判断第s[i] -> s[j] 构成的字串是否是回文串
我们来进一步分析这个状态转移的公式:
前提准备:
dp对角线元素一定是true,即是回文串
。class Solution {
public:
string longestPalindrome(string s) {
int n=s.size();
//---------------Tip1
if (n==1)
{
return s;
}
vector<vector<bool>> dp(n,vector<bool>(n));
for (int i=0;i<n;i++)
{
dp[i][i]=true; //对角线一定为true,相等于i==j
}
int start=0,max_len=1;
//---------------Tip2
for (int L=2;L<=n;L++)
{
for (int i=0;i<n;i++)
{
//--------------Tip3
//j-i+1=L
int j=L+i-1;
if (j>=n)
{
//右边界越界,直接退出
break;
}
//首尾相等,填充true。那么不相等就填充false
if (s[i]!=s[j])
{
dp[i][j]=false;
}
else
{
//到了这个else里面,那么就意味着 s[i] == s[j] 子串首尾字符是相同的
// j - i < 3: 填充长度小于等于3的字符串的状态
//长度小于等于3的长度为2的为true( s[i]=s[j])
//长度为3也是true(s[i] ==s[j]) && 中间的单独的字符,一定构成回文串。
if (j-i<3)
{
dp[i][j]=true;
}
else
{
//长度较长的则进入状态转换,由之前的状态转换得到。
dp[i][j]=dp[i+1][j-1];
}
}
//每次都要记录目标子串的长度与坐标
//1. 如果以 i为左,j为右的子串是dp[i][j]=true,则它是一个回文串
//并且长度大于之前记录的子串,则更新此最长的回文串。
if (dp[i][j] && j-i+1>max_len)
{
max_len=j-i+1;
start=i;
}
}
}
//根据得到的左边界坐标和长度得到目标子串
return s.substr(start,max_len);
}
};
需要注意的几个细节:
文章浏览阅读178次。研发管理(Research and Development Management,R&D Management)是一种系统性的管理活动,是以产品开发流程为基础的项目管理体系,旨在规划、组织、协调和监督研发项目,对研发项目的人员、计划、质量、成本等进行综合管理,从而打造高效能的研发团队,更好更快地实现项目目标。研发管理的本质是从流程化,标准化,制度化等维度建立管理机制。最终的核心目标是通过管理的法治建立标准化的操作规范,再通过标准化的规范提升人员的协作效率、监督机制、系统稳定性/安全性等。
文章浏览阅读1.3k次。简要介绍了磁盘访问性能相关指标,CPU的交互方式,和RAID_吞吐量和raid关系
文章浏览阅读2k次,点赞3次,收藏4次。塑胶类产品的生产依赖于模具(Tooling),曾经为公司做过一个塑胶模具的报价系统。模具的成本,与ERP中的产品成本原理相似,材料费,人工费和制造费用,再加上企业利润,构成基本的价格。 常用的公式如下所示 模具价格=模具材料费+模具加工费+税金+利润 其中材料费占20%~30%,加工费50%~60%;一般模具利润率10%~30%,大型模具利润率20%~35% 模具时间与成本的关系如下 ..._塑胶模报价计算公式
文章浏览阅读159次。最详细的还是 官方文档最简单的使用# -*- coding:utf-8 -*-import logginglogging.debug('debug message')logging.info('info message')logging.warn('warn message')logging.error('error message')logging.critical('crit..._logging模块ch在生产可以打开吗
文章浏览阅读933次。标题描述_千峰web前端开发
文章浏览阅读984次。一、引子过去很长一段时间里,大家在讲到高科技、互联网、信息技术的时候,谈的其实都是“软件”。从1995年微软发布Windows 95开始,高科技似乎就等同于软件业和互联网。著名的风险投资基金AndreessenHorowitz的合伙人Marc Andreessen,在2011年发表了一篇博客,声称“Software is Eating the World”。Marc Andree..._计算机组成原理 fpga
文章浏览阅读437次。react 里面的东西居中。_react图片居中
文章浏览阅读5.2k次。1.linux下安装完zookeeper之后,进入conf目录编辑zoo.cfg文件,找到dataDir属性更改其路径为zookeeper目录下的zkData文件夹.(因为其默认的目录在Linux下会定清理)(1)进入到zookeeper目录下的bin目录启动zookeeper,使用sh zkServer.sh命令启动zookeeper(或者zkServer.sh start命令启动).(2) 继续在bin目录下使用sh zkCli.sh命令启动zoo..._zookeeper访问地址
文章浏览阅读572次。下面是js的脚本,100G为例:// JS var num = 100Math.ceil(Math.ceil(num*1024/7.84423828125)*7.84423828125)使用方法,只要有浏览器就行,打开浏览器进入开发者模式F12,选择控制台将上面的代码粘贴到控制台中,红字部分为100G应分配的M数.如需其它容量大小自行修改100为对应的值..._win7分盘100g公式
文章浏览阅读70次。《Windows黑客编程技术详解》面向对计算机系统安全开发感兴趣,或者希望提升安全开发水平的读者,以及从事恶意代码分析研究的安全人员。理论技术与实战操作相辅相成,凸显“道与术”庖丁解牛式剖析Windows用户层和内核层黑客技术原理代码兼容性高,支持Windows 7到Windows 10全平台系统近年来,全球大规模爆发勒索病毒和挖..._demongan
文章浏览阅读5.2k次,点赞7次,收藏18次。很多小伙伴都会有疑惑,有的大神可以有自己独特的加载界面,其实这个编辑过程很简单,今天带大家来一起Try一Try! 长话短说,如果我们不做改变,每一个编辑器加载时的界面都是一样的,那我们怎么样去根据自己的喜好来改变这个logo呢?1.打开虚幻编辑器,项目设置2.项目设置中找到这个更改界面,然后把鼠标放在logo上,我们可以看到这个图片是虚幻自带的文件中原本就默认存在的,那我们就..._ue4 splash image
文章浏览阅读154次。90%的dp问题都能转化为最短路问题,拓扑图可以转化为dp问题。记住模型,到相似题目就会有更清晰的思路,不会到无从下手。_acwing提高课