LeetCode随缘刷题之最长回文子串
这一题我用的相对比较笨的方法。
相对于大佬们用的动态规划法,比较复杂。但却更容易理解,我主要是通过记录下标来确定最长回文串的。
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随缘刷题之最长回文子串的更多相关文章
- leetcode刷题五<最长回文子串>
下面是题目的描述 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 . 示例 : 输入: "babad" 输出: "bab" 注意: ...
- LeetCode刷题-005最长回文子串
给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为1000.示例 1:输入: "babad"输出: "bab"注意: "ab ...
- Leetcode 5. Longest Palindromic Substring(最长回文子串, Manacher算法)
Leetcode 5. Longest Palindromic Substring(最长回文子串, Manacher算法) Given a string s, find the longest pal ...
- LeetCode(5):最长回文子串
Medium! 题目描述: 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 长度最长为1000. 示例: 输入: "babad" 输出: "bab&quo ...
- [LeetCode] 5. Longest Palindromic Substring 最长回文子串
Given a string s, find the longest palindromic substring in s. You may assume that the maximum lengt ...
- leetcode 求一个字符串的最长回文子串
最长回文子串问题:给定一个字符串,求它的最长回文子串长度.如果一个字符串正着读和反着读是一样的,那它就是回文串. 给定一个字符串,求它最长的回文子串长度,例如输入字符串'35534321',它的最 ...
- [leetcode]5. Longest Palindromic Substring最长回文子串
Given a string s, find the longest palindromic substring in s. You may assume that the maximum lengt ...
- leecode第五题(最长回文子串)
class Solution { public: string longestPalindrome(string s) { int len = s.length(); || len == ) retu ...
- C#LeetCode刷题之#409-最长回文串(Longest Palindrome)
问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3788 访问. 给定一个包含大写字母和小写字母的字符串,找到通过这 ...
随机推荐
- 【JAVA今法修真】 第八章 仙道万维网 圣地元宇宙
您好,我是南橘,万法仙门的掌门,刚刚从九州世界穿越到地球,因为时空乱流的影响导致我的法力全失,现在不得不通过这个平台向广大修真天才们借去力量.你们的每一个点赞,每一个关注都是让我回到九州世界的助力,兄 ...
- APP自动化测试之手机滑屏
相信大家在安装一个APP之后,进入之前会有几个页面组成的滑屏欢迎页面,要对这个APP进行自动化测试之前,就需要实现自动滑屏,怎么实现呢?请继续往下看 滑屏分 左滑和右滑,上滑.下滑 实现的原理(左滑) ...
- 原型模式(python)
原型模式也叫克隆模式,通过拷贝自身的属性来创建一个新的对象,基本方法就是调用copy模块下的 (浅拷贝)copy() 和(深拷贝)deepcopy() #!/usr/bin/env python3 # ...
- PowerShell 管道符之Select的使用方法【二】
这次讲解Select中的第二个方法:String 在我们的ISE编辑器中输入如下命令 Select-String - 可以了解到,原来这是正则表达式,它提供了一些额外的正则方法.具体如何使用,可以自行 ...
- Java 总结 数据底层原理 【包括 ArrayList、LinkedList、hash table、HashMap、Hashtable、ConcurrentHashMap、hash code、HashSet、LinkedHashMap、LinkedHashSet】
1.ArrayList (1)底层是由动态数组实现的[使用了List接口]. (2)动态数组是长度不固定,随着数据的增多而变长. (3)如果不指定,默认长度为10,当添加的元素超过当前数组的长度时,会 ...
- Linux中安装java JDK
Linux中安装java JDK 1.下载jdk 下载地址:https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads. ...
- C++高并发场景下读多写少的解决方案
C++高并发场景下读多写少的解决方案 概述 一谈到高并发的解决方案,往往能想到模块水平拆分.数据库读写分离.分库分表,加缓存.加mq等,这些都是从系统架构上解决.单模块作为系统的组成单元,其性能好坏也 ...
- Spring循环依赖原理
Spring循环依赖的原理解析 1.什么是循环依赖? 我们使用Spring的时候,在一个对象中注入另一个对象,但是另外的一个对象中也包含该对象.如图: 在Student中包含了teacher的一个 ...
- 数组内sizeof与strlen的区别
1.数组在内存中是连续存放的,地址呈4个字节递增 2.数组的定义需要初始化,否则输出会已随机值输出 3.strlen()和sizeof()之间无关联:strlen():是求字符串长度的----只能针对 ...
- Kafka connector (kafka核心API)
前言 Kafka Connect是一个用于将数据流输入和输出Kafka的框架.Confluent平台附带了几个内置connector,可以使用这些connector进行关系数据库或HDFS等常用系统到 ...