从今天起,每天这里都会更新一道leetcode的算法结构题,旨在训练逻辑思维和代码功底,share一些优秀的解题思路给大家参考,每天早上开车,上班路上拿来一起思考思考~
给定一个字符串 s,找到 s 中最长的回文子串。
示例 1:
输入: "babad"输出: "bab"注意: "aba" 也是一个有效答案。
示例 2:
输入: "cbbd"输出: "bb"
示例 3:
输入: ""输出: ""
示例 4:
输入: "a"输出: "a"
先思考一下,后面我会给出一个解题思路~?
图来自网络
解决这类 “最优子结构” 问题,可以考虑使用 “动态规划”(dynamic programming)的方法,简称DP法,主要分两步走:
1、定义 “状态”;
2、找到 “状态转移方程”并求解。
Step 1: 定义 “状态”,初始值都是一样的
dp[j][i] 的值 表示字符子串 s[j, i] 是否构成回文串,为True或者False。
假如存在字符串s = ‘abcbs‘,因为字符串的长度为5,那么dp则为:
代码语言:javascript复制其中,图中圈起来的位置,代表子字符串 ‘bc’ 为 s[1, 3]。
Step 2:找到 “状态转移方程”。
如果 s[j, i] 是一个回文串,那么它两边各往里面“收缩”一个字符(如果可以的话)的子串 s[j 1, i - 1] 也一定是回文串,
即:
如果 dp[j][i] == true ,那么 dp[j 1][i - 1] = true 是肯定的。
反过来想,如果已知 dp[j 1, i - 1] == true 成立,那么如果s[j] == s[i] ,则 dp[j, i] == true。
但万一字符子串 s[j, i] “不可缩”?
为了保证字符子串 s[j, i]“可缩”,需要 j 1 < i - 1,即 i - j > 2,
那如果“不可缩”,则 i - j <=2 ,这个时候只需要判断 s[j] == s[i] 就可以断定是回文串。
所以,综上,无论是“可缩”还是“不可缩”,最终都需要判断s[j] == s[i] ,于是得到“状态转移方程”:
dp[j, i] = (s[j] == s[i] and (i - j <= 2 or dp[j 1, i - 1]))
Python实现:
代码语言:javascript复制# 动态规划求解
def longestPalindrome(s):
size = len(s)
if size <= 1:
return s
# 生成初始状态
dp = [[False for _ in range(size)] for _ in range(size)]
# 保存最长回文
longest_l = 1
res = s[0]
for i in range(size):
for j in range(i):
# 状态转移方程:如果头尾字符相等并且中间也是回文
# 或者“不可缩”
if s[j] == s[i] and (i - j <= 2 or dp[j 1][i - 1]):
dp[j][i] = True
if i - j 1 > longest_l:
longest_l = i - j 1
res = s[j:i 1]
return res
? 配图角色背景介绍:
钢铁侠是Marvel动漫系列的最新动作强片。故事主人托尼·斯塔克出生在纽约一个富豪家庭,从小衣来伸手饭来张口的他并未像所有的纨绔子弟那般只知道享乐胡闹。天生聪慧的斯塔克却是个出奇的天才,17岁毕业于麻省理工大学电力工程系,并以傲人的成绩成功找到了自己的社会定位——其家族企业“斯塔克军火公司”的新老板。父母的不幸去世反而更激发了托尼事业的前进动力。21岁时便开始掌控数百亿财产的他,逐渐确立了斯塔克公司作为美军第一军火供应商的雄厚地位。不过托尼傲慢自大的性格以及为达到目的不择手段的做法常常为自己找来很多麻烦。还好,他身边还有一个精明能干、性感迷人的女助手维吉尼亚·波茨时刻给自己无微不至的关怀和帮助。
但不久后的一次绑架事件彻底改变了托尼·斯塔克的一生。当托尼带领一班手下和军方观察员在荒无人烟的地界试验自己最新研制的成果时,不料遭遇一伙极其凶悍的恐怖分子的袭击。最终,混乱中被炮弹碎片击中心脏的托尼醒后发现胸口多了个奇怪的装置,正是这个仪器维系着自己的生命。原来是同为人质的英森博士用一块汽车电磁铁吸住了他体内的弹片,保住了托尼·斯塔克的性命,当然,救活他的恐怖分子自然不会是只为单纯地抓住这个武器设计专家,而是早就慕其大名有意为之。于是,恐怖分子开始软硬兼施,要求托尼·斯塔克为他们制造出威力更加巨大的武器。好汉不吃眼前亏,聪明的斯塔克更不会坐以待毙。于是,他在英森帮助下利用恐怖分子为其提供的粗糙设备和原材料,在暗无天日的地下基地里为自己造出了一块聚变能源活命和由聚变能源驱动的钢铁盔甲,具备很强的战斗能力。在与恐怖分子的火拼当中,英森博士为斯塔克争取时间不幸身亡,但却使逃脱的托尼改变了自己的以制造军火拯救世界的想法。于是,他改进了钢铁盔甲,制造了另一块聚变能源,成为真正的钢铁侠。
钢铁侠的力量与能力来自于他穿着的先进动力装甲。此装甲由原本笨重的铁甲装,慢慢进化更新成分子重整排序后的结晶铁,经磁场强化后覆盖于钛金属等数层其他金属上,形成一个有韧性但又极度坚实,且能提供极高防御作用的外壳。铁甲装赋予史塔克超人力量及飞行能力,其能源来自多种来源的总和,包括太阳能、电池,以及内建以吸收贝塔粒子为燃料的发电机。铁甲装还可以吸收周遭的能源,如热量与动能,并转化成电力,甚至可以直接吸收电力来为电池进行充电。东尼还加装了喷射推进器,足以让他拖着一整列火车前进;而小型的护目镜可在紧急时保护钢铁侠的双眼。除此之外,铁甲装还可以完全的与外界隔离,让钢铁侠可在真空或海底行动,具备内建的维生系统,并可隔绝放射线。
铁甲装的操控系统是借由头盔中神经机械学界面,读取史塔克的脑波进行运作。史塔克自行设计的具人工智能操控系统的高科技电脑,利用内部与外部的感应器,能提供战略资讯与机甲的即时状态报告。史塔克为确保机甲不会自主暴走,曾设立了防护系统,但这些系统曾一度被破坏。
铁甲装的武器系统也随着时间不断的演进,但钢铁侠的制式攻击武器一直都是其经由手套掌心发射出的冲击光束(Repulsor Ray)。内建在各代装甲中的武器包括了由胸口发射的单束光炮(Uni-Beam),随着运行吸收周围动能的脉冲光,运行距离越远就越强大;电磁冲波发射器;以及能量护盾。其他的功能包括了发射极冻光线(Ultra-Freon),制造与操控磁场,音波炮,用来制造诱饵的全像制造器。除了一般时期穿着的泛用功能装甲,史塔克还研发了数套特殊功能装甲,让他可以适应太空旅行,深海潜水,匿踪潜行等状态。史塔克还以他称为模组装甲的外加组件改造出如“反浩克”(Hulkbuster)式重装甲,设计来增强装甲的力量与耐力,让他足以单挑绿巨人浩克。后来还有一套专门用来对抗雷神索尔的装甲,是根据索尔的宿敌毁灭者(Destroyer)所改造出的,使用的是秘法能源。史塔克在装甲战争时期发展出一种电子盒,当放置在使用史塔克科技的装甲上时,可烧毁机件瘫痪装甲,但此电子盒对后来研发的款式无效用。
钢铁侠在与藉绝境(Extremis)病毒强化后的敌手麦伦(Mallen)交战后受到重伤,史塔克将改造过后的生化科技病毒注入自己的神经系统(称为绝境改造,Extremis Process),不但救了自己一命,还将铁甲装与自己的肉体融合在一起。这让他可以将钢铁侠装甲的内层储存在自己骨骼中空的部份,并可藉脑部的思绪直接进行控制。史塔克可以控制自己皮肤下的装甲内层,让装甲由四肢上数个出口显现出来,在皮下形成金色的神经界面。当史塔克进入此状态时,他可以以机灵感应远端控制铁甲装,而且即使装甲在一百英里远处外,史塔克仍可在任何时候着装。除此之外,绝境改造还增强了史塔克身体的治愈能力;他还可以远端连接外部的通讯系统,像是全世界的卫星,移动电话与电脑。由于装甲的操控系统现在已经直接与史塔克的神经系统相串连,铁甲装的反应速度已大幅度的提升。史塔克还具有“费落感应(Phera-Sense)”能力,史塔克分析他给予蜘蛛人的“蜘蛛装甲(Spider-Aromr)”所搜集到蜘蛛人的神经生理资讯,不但创造出他自己版本的“蜘蛛感应(Spider-Sense)”,还可以让蜘蛛人的蜘蛛感应发出假的警讯,让蜘蛛人的感应力无用化。