从今天起,每天这里都会更新一道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则为:

其中,图中圈起来的位置,代表子字符串 ‘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实现:

# 动态规划求解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)”,还可以让蜘蛛人的蜘蛛感应发出假的警讯,让蜘蛛人的感应力无用化。

【LeetCode01】找到字符串中最长的回文字串相关推荐

  1. Java中找出s字符串的回文_给定一个字符串 s,找到 s 中最长的回文子串。

    题目描述:给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 思路: 判断s[i..j]是否是回文字符串,依赖于s[i+1...j-1],这种一个问题的结果依赖于 ...

  2. 算法题——给你一个字符串s,找到s中最长的回文子串。

    一.给你一个字符串 s,找到 s 中最长的回文子串. 示例 1: 输入:s = "babad" 输出:"bab" 解释:"aba" 同样是符 ...

  3. C++ leetcode 5. 最长回文子串 给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。

    一.思路 从第二个遍历到最后一个,然后每次遍历从中间往两边找,这样可以找到所有的回文串 string longestPalindrome(string s) {int left;int right;i ...

  4. Java字符串中最长回文子字符串

    Longest palindrome substring in a string is a very common java interview question. To find out the l ...

  5. JS 找出字符串中最长回文子串

    给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 示例 1: 输入: "babad" 输出: "bab" 注意: &qu ...

  6. 怎么判断一个字符串的最长回文子串是否在头尾_最长回文字串/子序列问题(leetcode5,9,519)

    leetcode 5 最长回文子串 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 示例 1: 输入: "babad" 输出: " ...

  7. 力扣HOT100算法题5:最长回文字串

    文章目录 一.题目 二.方法一:解题思路 三.方法一:代码解析 四.方法二:动态规划 五.方法二:代码解析 一.题目 给你一个字符串 s,找到 s 中最长的回文子串. 示例 1:输入:s = &quo ...

  8. leetcode系列--5.最长回文字串

    leetcode系列–第5题.最长回文字串 给你一个字符串 s,找到 s 中最长的回文子串. 子串和子序列的区别: 子串:子串是指一个字串中连续的字串 子序列:子序列是指一个字串中非连续的字串 输入: ...

  9. 回文字串-字符串哈希

    回文子串-字符串哈希 前言 求解回文字串问题不仅可以用马拉车算法 ( O ( n ) ) (O(n)) (O(n)),也可以用字符串哈希 ( O ( n l o g n ) ) (O(nlogn)) ...

  10. 如何找到字符串中的最长回文子串?

    作者 | channingbreeze 责编 | 胡巍巍 小史是一个应届生,虽然学的是电子专业,但是自己业余时间看了很多互联网与编程方面的书,一心想进BAT互联网公司.可是努力了很久,别说BAT了,连 ...

最新文章

  1. 谷歌相册也不能无限白嫖了,「地主家」也烧不起免费网盘
  2. 原来还有dynamic这东西。
  3. 【正睿2021寒假省选第二轮集训 day 1】串 (后缀自动机+记忆化)
  4. 三农电子商务创业创新大赛作品_全国大学生电子商务“创新、创意及创业”挑战赛五邑大学校赛...
  5. 【ES6(2015)】Module模块
  6. mysql 备份 索引_mysql-索引、导入、导出、备份、恢复
  7. c++ map 获取key列表_一日一技:举例说明python中的map()方法
  8. plsql提示列快捷键_PLsql快捷键
  9. jsp中JAVA代码取select值_jsp获取下拉列表select选择的值 | 学步园
  10. Python type创建类
  11. 学习老男孩linux全程班决心书
  12. HALCON标定板简介
  13. HTTP协议基本原理简介(三)
  14. shell 脚本执行报错/bin/bash^M: bad interpreter: No such file or directory
  15. 儒豹公布09年7月手机搜索热门关键词排行榜
  16. 文件包含漏洞防范措施
  17. 专访阿里云褚霸等--挖掘数据库核心价值
  18. Activiti 会签/或签 设计思路
  19. 怎么做二维码?二维码制作的简单方法
  20. 感情能慢慢磨合慢慢培养吗_电视慢慢学习如何在网络上玩得开心

热门文章

  1. 在谷歌浏览器中安装IE Tab插件
  2. Nmap局域网主机存活发现
  3. 苏州大学计算机考研复试经验,苏大考研网:2014年苏州大学计算机考研经验
  4. 大数据技术之Spark入门(一)概述
  5. android 截屏实现的几种方式
  6. 8分钟教你学会局域网邮箱服务器搭建
  7. Linux 火狐无法播放视频
  8. 串级PID控制(多闭环PID控制)的理解
  9. 遗传算法bp神经网络原理,bp神经网络和遗传算法
  10. Origin抗锯齿和出现大C