这一题我用的相对比较笨的方法。
相对于大佬们用的动态规划法,比较复杂。但却更容易理解,我主要是通过记录下标来确定最长回文串的。

  1. package leetcode.day_12_06;
  2. /**
  3. * 给你一个字符串 s,找到 s 中最长的回文子串。
  4. * <p>
  5. * <p>
  6. * 示例 1:
  7. * <p>
  8. * 输入:s = "babad"
  9. * 输出:"bab"
  10. * 解释:"aba" 同样是符合题意的答案。
  11. * 示例 2:
  12. * <p>
  13. * 输入:s = "cbbd"
  14. * 输出:"bb"
  15. * 示例 3:
  16. * <p>
  17. * 输入:s = "a"
  18. * 输出:"a"
  19. * 示例 4:
  20. * <p>
  21. * 输入:s = "ac"
  22. * 输出:"a"
  23. *
  24. * @author soberw
  25. * @Classname LongestPalindrome0005
  26. * @Description
  27. * @Date 2021-12-06 12:39
  28. */
  29. public class LongestPalindrome0005 {
  30. /**
  31. * @param s 需要查找的字符串
  32. * @description: 找到 s 中最长的回文子串。
  33. * @return: 最长回文子串
  34. * @author: soberw
  35. * @time: 2021/12/6 12:40
  36. */
  37. public String longestPalindrome(String s) {
  38. //直接返回
  39. if (s.length() == 0 || s.length() == 1) {
  40. return s;
  41. }
  42. int len = s.length();
  43. //定义回文子串的起止下标
  44. int start = 0;
  45. int end = 0;
  46. //定义两个指针(头尾)
  47. int left = 0;
  48. int right = 0;
  49. for (int i = 0; i < len; i++) {
  50. left = i;
  51. right = i;
  52. //从当前位置开始,判断尾指针后面的字符是否与当前所指相等,相等继续向后比较
  53. //旨在找到连续字符
  54. while (right < len - 1 && s.charAt(right) == s.charAt(right + 1)) {
  55. right++;
  56. }
  57. //在连续字符的基础上,判断其前一个是否和后一个相等,以此类推
  58. while (left > 0 && right < len - 1 && s.charAt(left - 1) == s.charAt(right + 1)) {
  59. left--;
  60. right++;
  61. }
  62. //始终保持start和end是最大的范围
  63. if ((end - start) < (right - left)) {
  64. start = left;
  65. end = right;
  66. }
  67. }
  68. return s.substring(start, end + 1);
  69. }
  70. public static void main(String[] args) {
  71. System.out.println(new LongestPalindrome0005().longestPalindrome("babad"));
  72. System.out.println(new LongestPalindrome0005().longestPalindrome("cbbd"));
  73. System.out.println(new LongestPalindrome0005().longestPalindrome(""));
  74. System.out.println(new LongestPalindrome0005().longestPalindrome("a"));
  75. }
  76. }

运行结果:


可能上面的解释还比较笼统,下面我画图演示一下执行流程:
例一:输入"bbbbb”:

刚开始left=0,right=0
程序进入第一个while循环,且满足条件,因为s[0]=s[1]=“b”,所以right++
向后走发现继续相等,就一直向后,直到不满足条件退出
此时right = len - 1
不满足第二个循环条件(其实就是right走到头了)

就这样进行下去,保证(end - start)始终是最长的,最后只需要截取就行了

例二:输入“babc”

刚开始left=0,right=0 程序进入第一个while循环,不满足条件,即“b” != “a”,进入第二个循环(不满足条件直接退出)

第二遍,此时left=right=1,不满足第一个循环,进入第二个,发现s[left - 1] = s[right + 1],于是继续循环。此时left=0,退出

就这样进行下去,保证(end - start)始终是最长的,最后start=0,end=2
截取为“bab”

简而言之:

整个代码的结果就是从左到右遍历,无连续相同的就以当前字符向两侧遍历看是否相等,有则从连续字符两侧遍历

LeetCode随缘刷题之最长回文子串的更多相关文章

  1. leetcode刷题五<最长回文子串>

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

  2. LeetCode刷题-005最长回文子串

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

  3. Leetcode 5. Longest Palindromic Substring(最长回文子串, Manacher算法)

    Leetcode 5. Longest Palindromic Substring(最长回文子串, Manacher算法) Given a string s, find the longest pal ...

  4. LeetCode(5):最长回文子串

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

  5. [LeetCode] 5. Longest Palindromic Substring 最长回文子串

    Given a string s, find the longest palindromic substring in s. You may assume that the maximum lengt ...

  6. leetcode 求一个字符串的最长回文子串

    最长回文子串问题:给定一个字符串,求它的最长回文子串长度.如果一个字符串正着读和反着读是一样的,那它就是回文串.   给定一个字符串,求它最长的回文子串长度,例如输入字符串'35534321',它的最 ...

  7. [leetcode]5. Longest Palindromic Substring最长回文子串

    Given a string s, find the longest palindromic substring in s. You may assume that the maximum lengt ...

  8. leecode第五题(最长回文子串)

    class Solution { public: string longestPalindrome(string s) { int len = s.length(); || len == ) retu ...

  9. C#LeetCode刷题之#409-最长回文串(Longest Palindrome)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3788 访问. 给定一个包含大写字母和小写字母的字符串,找到通过这 ...

随机推荐

  1. PHP-FPM 开启慢日志记录

    首先,找到 php-fpm 所在的目录: 使用 which php-fpm 使用 whereis php-fpm 然后找到 php-fpm.conf 所在的目录: 使用 ps -ef | grep p ...

  2. centos6.5-svn搭建文档

    下载相关软件 wget http://subversion.tigris.org/downloads/subversion-1.6.6.tar.gz wget http://subversion.ti ...

  3. spring-data-jpa ----OneToMany 一对多

    环境搭建 导入依赖  maven3.6.3 <properties> <spring.version>5.2.5.RELEASE</spring.version> ...

  4. How to die?

    下次给一个 vector 搞 unique 之前,一定要记得给它排序!!1(少点自以为是) 对一个 set "同时"删除两个数时,一定要注意特判两个数是否重复/重叠. 有两个序列, ...

  5. tmux安装配置与使用

    tmux安装 sudo apt-get install tmux tmux配置 在家目录下操作 cd git clone https://github.com/gpakosz/.tmux.git ln ...

  6. 【刷题-LeetCode】198 House Robber

    House Robber You are a professional robber planning to rob houses along a street. Each house has a c ...

  7. 【分享】让prometheus支持PUSH模式,可以使用remote write协议推送数据

    2021-10-21补充: 我通过修改源码来让prometheus支持remote-write,纯属多此一举: --enable-feature=remote-write-receiver这个命令行参 ...

  8. android ndk下没有pthread_yield,好在std::this_thread::yield()可以达到同样的效果

    一个多线程的算法中,发现线程利用率只有47%左右,大量的处理时间因为usleep(500)而导致线程睡眠: 性能始终上不去. 把usleep(500)修改为std::this_thread::yiel ...

  9. virtual studio发布到gihub

    问题 我们想要发布代码到github或者微软团队服务时候,往往发现没有本地库,所以难以发布. 解决方案 在解决方右击就可以新建git 文件都会出现小锁说明有了记录 文件夹会对应出现 右上角管理连接也会 ...

  10. 005 Linux 命令三剑客之-sed

    grep:数据查找定位 awk:数据切片,数据格式化,功能最复杂 sed:数据修改 01 Linux 命令三剑客? 三剑客各有所长,和锅锅一一搞起就是了! sed:擅长数据修改. grep:擅长数据查 ...