当前位置: 首页 > article >正文

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

LeetCode 5.最长回文子串

题目描述

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

示例 1:

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

示例 2:

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

说明:

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

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.kler.cn/a/397585.html

相关文章:

  • 整数唯一分解定理
  • IDC 报告:百度智能云 VectorDB 优势数量 TOP 1
  • HbuilderX 插件开发-模板创建
  • hrnet人体关键点检测模型适配atlas笔记
  • 基本数据类型和包装类型的区别、缓存池、自动拆箱装箱(面试题)
  • 0 -vscode搭建python环境教程参考(windows)
  • unity3d————异步加载练习题
  • [A-18]ARMv8/ARMv9-Memory-内存空间的属性(Attributes Properties)
  • OpenCV、YOLO、VOC、COCO之间的关系和区别
  • 前端pdf预览方案
  • Android LiveData 处理数据倒灌的几种措施
  • 计算机视觉 ---图像读取与显示(OpenCV与Matplotlib)
  • ‌EAC(Estimate at Completion)和ETC(Estimate to Complete)
  • c# Encoding.GetEncoding
  • 后端返回大数问题
  • rk3399开发环境使用Android 10初体验蓝牙功能
  • 计算光纤色散带来的相位移动 matlab
  • vue.js设计与实现(霍春阳著) 章节总结
  • golang对日期格式化
  • Tailwind CSS 和 UnoCSS简单比较
  • 数据库管理-第262期 崖山:知其不可而为之(20241116)
  • 【笔记】Vue3回忆录
  • 【C语言指南】C语言内存管理 深度解析
  • aitrader双界面引擎(dash和streamlit),引入zvt作为数据获取及存储支持
  • 以太坊基础知识结构详解
  • 将大型语言模型(如GPT-4)微调用于文本续写任务