前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【算法沉淀】最长回文子串

【算法沉淀】最长回文子串

作者头像
苏泽
发布2024-03-10 09:20:51
740
发布2024-03-10 09:20:51
举报
文章被收录于专栏:后端开发从入门到入魔

5. 最长回文子串

提示

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

子串

如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。

示例 1:

代码语言:javascript
复制
输入:s = "babad"
输出:"bab"
解释:"aba" 同样是符合题意的答案。

示例 2:

代码语言:javascript
复制
输入:s = "cbbd"
输出:"bb"

提示:

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

题目解析: 给定一个字符串s,需要找到s中最长的回文子串。回文字符串是指正序和反序都相同的字符串。

思路如下:

  1. 初始化两个指针left和right,分别表示当前考虑的子串的左右边界。初始时,left=0,right=0。
  2. 使用一个变量max_len来记录最长回文子串的长度,初始值为0。同时使用一个变量start来记录最长回文子串的起始位置,初始值为0。
  3. 使用两层循环来枚举所有可能的子串。外层循环使right指针从0到字符串末尾,内层循环使left指针从0到right。
  4. 对于每个子串,检查其是否为回文。如果是,并且其长度大于max_len,则更新max_len和start。
  5. 在检查子串是否为回文时,可以使用双指针法。初始化两个指针p1和p2,分别指向子串的首尾。如果p1和p2指向的字符相同,则将p1向右移动一位,p2向左移动一位。如果p1和p2指向的字符不同,则说明该子串不是回文。
  6. 在遍历完所有子串后,最长回文子串的起始位置为start,长度为max_len。
代码语言:javascript
复制
public class Solution {
    public String longestPalindromicSubstring(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) {
        int L = left, R = right;
        while (L >= 0 && R < s.length() && s.charAt(L) == s.charAt(R)) {
            L--;
            R++;
        }
        return R - L - 1;
    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-03-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档