leetcode hot100【LeetCode 5.最长回文子串】java实现

news/2024/11/17 8:17:05/

LeetCode 5.最长回文子串

题目描述

给定一个字符串 s,找到 s 中最长的回文子串。

示例 1:

输入: s = "babad"
输出: "bab"
解释: "aba" 也是一个有效答案。

示例 2:

输入: s = "cbbd"
输出: "bb"

说明:

  • 1 <= s.length <= 1000
  • s 仅由数字和英文字母组成

Java 实现代码

java">public class Solution {public String longestPalindrome(String s) {if (s == null || s.length() < 1) {return "";}int start = 0, end = 0;  // 最长回文子串的起始和结束位置for (int i = 0; i < s.length(); i++) {int len1 = expandAroundCenter(s, i, i);    // 以单个字符为中心int len2 = expandAroundCenter(s, i, i + 1); // 以两个字符为中心int len = Math.max(len1, len2);if (len > (end - start)) {start = i - (len - 1) / 2;end = i + len / 2;}}return s.substring(start, end + 1);}// 中心扩展法private int expandAroundCenter(String s, int left, int right) {while (left >= 0 && right < s.length() && s.charAt(left) == s.charAt(right)) {left--;right++;}return right - left - 1;  // 返回回文串的长度}
}

解题思路

该问题的核心是寻找字符串中最长的回文子串。回文子串的特点是从前向后和从后向前的字符相同。我们可以用几种方法来求解此问题,最常见的解法是通过
中心扩展法 来解决。

中心扩展法
  1. 回文的特点: 一个回文串可以通过其中心向两边扩展。例如,回文串 "aba" 的中心是 "b",从中间扩展出去,得到回文串。

  2. 中心扩展法的核心思想:

    • 每个字符(或每两个字符之间)可以看作回文的中心。
    • 从该中心开始,尝试向左右两侧扩展,找到最大长度的回文子串。
  3. 具体步骤:

    • 对于每个字符 i,考虑两种情况:
      • 以字符 i 为中心的奇数长度回文串。
      • 以字符 ii+1 为中心的偶数长度回文串。
    • 使用一个函数 expandAroundCenter(left, right) 来扩展回文串。
    • 对每个字符中心调用扩展函数,记录最大长度的回文子串。

复杂度分析

  • 时间复杂度O(n^2),其中 n 是字符串的长度。每次扩展时的时间复杂度为 O(n),总共需要执行 n 次扩展。
  • 空间复杂度O(1),只使用了常数空间来存储一些变量,不依赖于输入数据的大小。

http://www.ppmy.cn/news/1547678.html

相关文章

第五章:存储过程和触发器

&#x1f308;个人主页&#xff1a;小新_- &#x1f388;个人座右铭&#xff1a;“成功者不是从不失败的人&#xff0c;而是从不放弃的人&#xff01;”&#x1f388; &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd; &#x1f3c6;所属专栏&#xff1…

计算机网络 (3)计算机网络的性能

一、计算机网络性能指标 速率&#xff1a; 速率是计算机网络中最重要的性能指标之一&#xff0c;它指的是数据的传送速率&#xff0c;也称为数据率&#xff08;Data Rate&#xff09;或比特率&#xff08;Bit Rate&#xff09;。速率的单位是比特/秒&#xff08;bit/s&#xff…

《鸿蒙生态:开发者的机遇与挑战》

一、引言 在当今科技飞速发展的时代&#xff0c;操作系统作为连接硬件与软件的核心枢纽&#xff0c;其重要性不言而喻。鸿蒙系统的出现&#xff0c;为开发者带来了新的机遇与挑战。本文将从开发者的角度出发&#xff0c;阐述对鸿蒙生态的认知和了解&#xff0c;分析鸿蒙生态的…

uniapp luch-request 使用教程+响应对象创建

1. 介绍 luch-request 是一个基于 Promise 开发的 uni-app 跨平台、项目级别的请求库。它具有更小的体积、易用的 API 和方便简单的自定义能力。luch-request 支持请求和响应拦截、全局挂载、多个全局配置实例、自定义验证器、文件上传/下载、任务操作、自定义参数以及多拦截器…

Spring Boot核心概念:依赖管理

依赖管理是构建和维护Spring Boot应用程序的关键方面。它涉及定义、解析和使用外部库或模块的过程&#xff0c;这些库或模块是应用程序运行所需的。Spring Boot使用Maven或Gradle作为其构建工具&#xff0c;并提供了所谓的“起步依赖”来进一步简化依赖管理过程。 Maven依赖管…

动态规划-背包问题——[模版]完全背包问题

1.题目解析 题目来源 [模版]完全背包_牛客题霸_牛客 测试用例 2.算法原理 1.状态表示 与01背包相同&#xff0c;这里的完全背包也是需要一个二维dp表来表示最大价值&#xff0c;具体如下 求最大价值dp[i][j]:在[1,i]区间选择物品&#xff0c;此时总体积不大于j时的最大价值 求…

ChatGPT:编程的 “蜜糖” 还是 “砒霜”?告别依赖,拥抱自主编程的秘籍在此!

在当今编程界&#xff0c;ChatGPT 就像一颗耀眼却又颇具争议的新星&#xff0c;它对编程有着不可忽视的影响。但这影响就像一把双刃剑&#xff0c;使用不当&#xff0c;就可能让我们在编程之路上“受伤”。 一、过度依赖 ChatGPT 编程&#xff1a;黑暗深渊里的重重危机 1、个…

深度学习之循环神经网络(RNN)

1 为什么需要RNN&#xff1f; ​ 时间序列数据是指在不同时间点上收集到的数据&#xff0c;这类数据反映了某一事物、现象等随时间的变化状态或程度。一般的神经网络&#xff0c;在训练数据足够、算法模型优越的情况下&#xff0c;给定特定的x&#xff0c;就能得到期望y。其一…