重温算法之最长回文子串

156 阅读1分钟

Offer 驾到,掘友接招!我正在参与2022春招系列活动-刷题打卡任务,点击查看活动详情

一.题目介绍

1.题目来源

链接:LeetCode

2.题目

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

示例 1:

输入:s = "babad" 输出:"bab" 解释:"aba" 同样是符合题意的答案。

示例 2:

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

二.具体实现

1.实现思路

动态规划,这个题目的切入点是如果去针对每个元素做比较,那么就比较耗时,能够减少多重计算的方法就是定义其起点,终点以及其长度,这几个点都是临时存储的局部变量,我们先对数组相邻位置进行判断,如果其字符串相同则是找到了回文,依次类推,就能够找到字符串中最长的回文子串。

2.实现代码

1)自己的实现方式

public String longestPalindrome(String s) {
    if (s == null || s.length() < 2) {
        return s;
    }
    int strLen = s.length();
    //最长回文串的起点
    int maxStart = 0;  
     //最长回文串的终点
    int maxEnd = 0;   
     //最长回文串的长度
    int maxLen = 1; 
    //true:就是回文, false:不是回文
    boolean[][] dp = new boolean[strLen][strLen];
    for (int r = 0; r<strLen; r++){
        for (int l = 0; l < r; l++){
            if (s.charAt(l) == s.charAt(r) && (r - l <=2 || dp[l + 1][r-1])){
                dp[l][r] = true;
                if (r - l + 1 > maxLen) {
                    maxLen = r - l + 1;
                    maxStart = l;
                    maxEnd = r;

                }
            }
        }
    }
    return s.substring(maxStart, maxEnd + 1);
}

2)题友的实现方式

暴力求解,列举所有的子串,判断是否为回文串,保存最长的回文串。 image.png

3.运行结果

image.png

image.png

三.题后思考

关于回文的题目,核心思路还是依次比较,找到回文,然后进行其他的操作,另外官方题解中心扩散法也是一个最优解。