回文串是面试常常遇到的问题(虽然问题本身没啥意义),本文就告诉你回文串问题的核心思想是什么。

首先,明确一下什:回文串就是正着读和反着读都一样的字符串。

比如说字符串aba和abba都是回文串,因为它们对称,反过来还是和本身一样。反之,字符串abac就不是回文串。

可以看到回文串的的长度可能是奇数,也可能是偶数,这就添加了回文串问题的难度,解决该类问题的核心是双指针。下面就通过一道最长回文子串的问题来具体理解一下回文串问题:

string longestPalindrome(string s){}

一、思考

对于这个问题,我们首先应该思考的是,给一个字符串s,如何在s中找到一个回文子串?

有一个很有趣的思路:既然回文串是一个正着反着读都一样的字符串,那么如果我们把s反转,称为s',然后在s和s'中寻找最长公共子串,这样应该就能找到最长回文子串。

比如说字符串abacd,反过来是dcaba,它俩的最长公共子串是aba,也就是最长回文子串。

但是这个思路是错误的,比如说字符串aacxycaa,反转之后是aacyxcaa,最长公共子串是aac,但是最长回文子串应该是aa。

虽然这个思路不正确,但是这种把问题转化为其他形式的思考方式是非常值得提倡的。

下面,就来说一下正确的思路,如何使用双指针。

寻找回文串的问题核心思想是:从中间开始向两边扩散来判断回文串。对于最长回文子串,就是这个意思:

for 0 <= i

找到以 s[i] 为中心的回文串

更新答案

但是呢,我们刚才也说了,回文串的长度可能是奇数也可能是偶数,如果是abba这种情况,没有一个中心字符,上面的算法就没辙了。所以我们可以修改一下:

for 0 <= i

找到以 s[i] 为中心的回文串

找到以 s[i] 和 s[i+1] 为中心的回文串

更新答案

PS:读者可能发现这里的索引会越界,等会会处理。

二、代码实现

按照上面的思路,先要实现一个函数来寻找最长回文串,这个函数是有点技巧的:

为什么要传入两个指针l和r呢?因为这样实现可以同时处理回文串长度为奇数和偶数的情况:

for 0 <= i

# 找到以 s[i] 为中心的回文串

palindrome(s, i, i)

# 找到以 s[i] 和 s[i+1] 为中心的回文串

palindrome(s, i, i + 1)

更新答案

下面看下longestPalindrome的完整代码:

至此,这道最长回文子串的问题就解决了,时间复杂度 O(N^2),空间复杂度 O(1)。

值得一提的是,这个问题可以用动态规划方法解决,时间复杂度一样,但是空间复杂度至少要 O(N^2) 来存储 DP table。这道题是少有的动态规划非最优解法的问题。

另外,这个问题还有一个巧妙的解法,时间复杂度只需要 O(N),不过该解法比较复杂,我个人认为没必要掌握。该算法的名字叫 Manacher's Algorithm(马拉车算法),有兴趣的读者可以自行搜索一下。

●编号1036,输入编号直达本文

●输入m获取文章目录

程序员数学之美

程序员数学学习

锻炼数学逻辑思维

python 面试题 aac caa相似_经典面试题:最长回文子串相关推荐

  1. LHL算法入门经典 例题3-3最长回文子串

    ##3-3[字符串]最长回文子串 题目描述 输入一个字符串,求出其中最长的回文子串.子串的含义是:在原串中连续出现的字符串片段.回文的含义是:正着看和倒着看相同.如abba和yyxyy.在判断回文时, ...

  2. python生成回文字符串_回文字符串最长回文子串和子序列 - Python

    Palindrome 回文字符串就是指从前往后和从后往前读,都是一样的,比如"aabcbaa". 注意区分子串和子序列,子串是连续的,子序列可以不连续 题型1:判断字符串是否为回文 ...

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

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

  4. python求回文_python实现求最长回文子串长度

    给定一个字符串,求它最长的回文子串长度,例如输入字符串'35534321',它的最长回文子串是'3553',所以返回4. 最容易想到的办法是枚举出所有的子串,然后一一判断是否为回文串,返回最长的回文子 ...

  5. 数组字符串那些经典算法:最大子序列和,最长递增子序列,最长公共子串,最长公共子序列,字符串编辑距离,最长不重复子串,最长回文子串 (转)...

    作者:寒小阳 时间:2013年9月. 出处:http://blog.csdn.net/han_xiaoyang/article/details/11969497. 声明:版权所有,转载请注明出处,谢谢 ...

  6. 最大子串和 python_5. 最长回文子串(Python)

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

  7. Python最长回文子串

    1.暴力解法(Brute Method)        暴力求解是最容易想到的,要截取字符串的所有子串,然后再判断这些子串中哪些是回文的,最后返回回文子串中最长的即可. 这里我们可以使用两个变量,一个 ...

  8. 力扣Leetcode:5. 最长回文子串(Python)

    题目描述 给你一个字符串 s,找到 s 中最长的回文子串. 题解:动态规划 这是一道很经典的题目.首先我想到了动态规划算法: 对于子串s[i-j],它为回文子串的条件为:s[i+1 - j-1]为回文 ...

  9. python最长回文子串leetcode_Python版LeetCode5. 最长回文子串

    本文转载自[微信公众号:机器学习算法与Python精研,ID:AITop100]经微信公众号授权转载,如需转载与原文作者联系 题目: 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的 ...

最新文章

  1. PHP Session中保存Object
  2. 记录一下vlfeat视觉库配置
  3. 小卡片遇热就变机器人,不插电就能运动,哈佛加州理工新研究登上Nature子刊...
  4. 转 Wireshark和TcpDump抓包分析心得
  5. HarmonyOS之AI能力·关键字提取
  6. 转:12个信号判断男人肾不好
  7. UVa 11346 - Probability
  8. 2022零售行业消费趋势新主张
  9. jpg怎么合成一份_海外商标注册申请程序复杂吗?应该怎么注册?
  10. Java基础复习——访问权限
  11. bzoj 3361: [Usaco2004 Jan]培根距离
  12. 如何用python编写操作系统_操作系统介绍、python基础
  13. 机器学习LDA——实验报告
  14. 985 材料专业研究生年薪 20 多万也不少了吧,为什么还有那么多人劝退,转行能挣多少钱?
  15. 服务熔断降级什么意思?
  16. 码码在线考勤系统笔记(四)
  17. 【Lilishop商城】No4-1.业务逻辑的代码开发,涉及到:会员B端第三方登录使用及后端接口(微信、QQ等)
  18. android usb联接网络打印机,打印到USB或预先选择的网络打印机从嵌入式android
  19. 产消合一。有感于华人新首富赵长鹏投资福布斯的话
  20. 51单片机 玩转按键加减切换+数码管+Proteus仿真

热门文章

  1. 软件测试压力测试例子,第一个web压力测试例子 - 稻香老农 - 51Testing软件测试网 51Testing软件测试网-软件测试人的精神家园...
  2. gpt.4.0-gpt 国内版
  3. 10-252 B1-6统计客户的订单信息
  4. 什么是CSMA/CD
  5. 阿里云和腾讯云免费SSL证书 专题
  6. redis之地理位置
  7. svhost占用内存过高
  8. 开源PLM软件Aras详解三 服务端简易开发
  9. unity android服务器端,【深圳Unity3D培训】 Android客户端与PC服务器实现Socket通信
  10. 牛客网wannafly挑战赛13-D(贪心)