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

package leetcode.day_12_06;

/**
* 给你一个字符串 s,找到 s 中最长的回文子串。
* <p>
* <p>
* 示例 1:
* <p>
* 输入:s = "babad"
* 输出:"bab"
* 解释:"aba" 同样是符合题意的答案。
* 示例 2:
* <p>
* 输入:s = "cbbd"
* 输出:"bb"
* 示例 3:
* <p>
* 输入:s = "a"
* 输出:"a"
* 示例 4:
* <p>
* 输入:s = "ac"
* 输出:"a"
*
* @author soberw
* @Classname LongestPalindrome0005
* @Description
* @Date 2021-12-06 12:39
*/
public class LongestPalindrome0005 {
/**
* @param s 需要查找的字符串
* @description: 找到 s 中最长的回文子串。
* @return: 最长回文子串
* @author: soberw
* @time: 2021/12/6 12:40
*/
public String longestPalindrome(String s) {
//直接返回
if (s.length() == 0 || s.length() == 1) {
return s;
}
int len = s.length();
//定义回文子串的起止下标
int start = 0;
int end = 0;
//定义两个指针(头尾)
int left = 0;
int right = 0;
for (int i = 0; i < len; i++) {
left = i;
right = i;
//从当前位置开始,判断尾指针后面的字符是否与当前所指相等,相等继续向后比较
//旨在找到连续字符
while (right < len - 1 && s.charAt(right) == s.charAt(right + 1)) {
right++;
}
//在连续字符的基础上,判断其前一个是否和后一个相等,以此类推
while (left > 0 && right < len - 1 && s.charAt(left - 1) == s.charAt(right + 1)) {
left--;
right++;
}
//始终保持start和end是最大的范围
if ((end - start) < (right - left)) {
start = left;
end = right;
}
}
return s.substring(start, end + 1);
} public static void main(String[] args) {
System.out.println(new LongestPalindrome0005().longestPalindrome("babad"));
System.out.println(new LongestPalindrome0005().longestPalindrome("cbbd"));
System.out.println(new LongestPalindrome0005().longestPalindrome(""));
System.out.println(new LongestPalindrome0005().longestPalindrome("a"));
}
}

运行结果:


可能上面的解释还比较笼统,下面我画图演示一下执行流程:
例一:输入"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. golang 算法题 : 两数相加

    package mainimport "fmt"type ListNode struct { Val int Next *ListNode}func main() { l1 := ...

  2. solr -创建 core

    需要进入solr安装目录的bin 里,solr start 启动 后,才可以生成core solr create -c [core的名字] 如:solr create -c mycore1 生成位置在 ...

  3. @RestController和@Controller的关系

    @RestController注解,相当于@Controller+@ResponseBody两个注解的结合

  4. linux笔记(一)

    linux 开源镜像网址:http://mirrors.163.com pwd : 展示当前所在的目录的绝对路径 cd : 切换到某个路径  cd 命令,是 Change Directory 的缩写, ...

  5. POJ 2387 Til the Cows Come Home (最短路径 模版题 三种解法)

    原题链接:Til the Cows Come Home 题目大意:有  个点,给出从  点到  点的距离并且  和  是互相可以抵达的,问从  到  的最短距离. 题目分析:这是一道典型的最短路径模版 ...

  6. Bootstrap实战 - 响应式布局

    一.介绍 响应式布局就是一个网站能够兼容多个终端,而不是为每个终端做一个特定的版本.这个概念是为解决移动互联网浏览而诞生的. 导航栏与轮播在大部分网站的头部占很高的比重,特别是导航栏,扮演着网站地图的 ...

  7. unittest测试框架

    unittest单元测试框架不仅可以适用于单元测试,还可以适用WEB自动化测试用例的开发与执行,该测试框架可组织执行测试用例,并且提供了丰富的断言方法,判断测试用例是否通过,最终生成测试结果. 一.u ...

  8. 【reverse】逆向3 寻找地址

    [reverse]逆向3 寻找地址 寻址公式一:[立即数] 读取内存的值: mov eax,dword prt ds:[0x13FFC4] 将内存编号为0x13FFC4.0x13FFC5.0x13FF ...

  9. gin中multipart/urlencoded表单

    package main import ( "github.com/gin-gonic/gin" ) func main() { router := gin.Default() r ...

  10. Python小练习更改版(更改一部分代码,与错误)

    之前上传的发现有部分代码错误,重新上传: 更改了第一次的代码与错误,增加了注释与商店部分功能: 没有每天坚持更新博客,与初衷相差甚远,坚持!每天进步一点点! user_list.txt 部分代码: { ...