最长回文子串

简介: 最长回文子串

背景

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

示例 1:

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

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

提示:

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

感兴趣的小伙伴可以查看原题:leetcode.cn/problems/lo…

分析

由题意可知,我们首先要判断什么是回文;回文就是字符串翻转后和翻转前一模一样,比如"上海自来水来自海上",翻转后依然是"上海自来水来自海上";下面我们使用java代码作为示例来看看如何判断回文:

private boolean isPalindrome(String s){
    // 当前字符串是否和翻转后的字符串一样
    return s.equals(new StringBuilder(s).reverse().toString());
}
复制代码

我们可以使用JDK中现有的reverse()方法来判断是否是回文;也可以自己实现回文的判断:

private boolean isPalindrome(String s){
        // 取出字符串的长度
        int len = s.length();
        // 首尾压缩
        for(int i=0;i<len-i-1;i++){
            // 从前向后取字符
            char a = s.charAt(i);
            // 从后向前取字符
            char b = s.charAt(len-i-1);
            // 比较两个字符大小,一旦不相等,就说明不是回文
            if(a-b!=0){
                // 不是回文
                return false;
            }
        }
        // 全部比较完毕后,没有发现不相等的字符,说明是回文
        return true;
    }
复制代码

另一个问题就是如何判断是否是最长的回文,我们需要创建两个索引值从字符串的首尾向中间压缩来判断中间的字符串是否是最长回文;

下面我们使用hello这个字符串来举例子,通过图示的方式来简要概述一下算法的过程:

e316fa5b2fbd4c68b29035f4e075d776_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

2f5b731b1abd462dbc3638efedbe49aa_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

0a965576863846aca008218e43a5162f_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

9a24d2af1df14960ae4d07992cccebfd_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

70b28de6b9344062be76eee2838193df_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

12e8c65b0d934a7589f5a9123e08d6dc_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

decfda118f194c9c90c379a86d36bbcb_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

23ff7bb69341490192ad8d0e9adc3444_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

0b5ca8732064413ab2afc0406e6696f3_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

54f2780826b240688d74ac8e7a44b6dc_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png


java实现

// 判断是否是回文
private boolean isPalindrome(String s){
    return s.equals(new StringBuilder(s).reverse().toString());
}
public String longestPalindrome(String s) {
        // 如果字符串中只有一个字符,或者直接可以判断是回文,那么最长回文肯定是本身
        if(s.length()==1||isPalindrome(s)){
            // 直接返回当前字符串
            return s;
        }
        // 先默认一个字符作为结果
        String result=s.substring(0,1);
        // 目前的最长长度为1
        int sum = 1;
        // 获取字符串长度
        int len = s.length();
        // 使用双重循环从首尾开始压缩
        // 从前向后取字符
        for(int i=0;i<len;i++){
            // 取出前面的字符
            Character a = s.charAt(i);
            // 从后向前取字符
            for(int j=len-1;j>i;j--){
                // 取出后面的字符
                Character b = s.charAt(j);
                // 如果两个字符不一样,肯定不是回文,那么继续向前取字符,找下一个最长回文
                if(!a.equals(b)){
                    // 继续向前取字符
                    continue;
                }
                // 如果字符一样,那么我们把字符间的字符串截取出来
                String ss=s.substring(i,j+1);
                // 判断截取的字符串是否是回文,如果不是回文,那么继续向前取字符,找下一个最长回文
                if(!isPalindrome(ss)){
                    // 不是回文,继续向前取字符
                    continue;
                }
                // 如果是回文,那么还要判断当前回文的长度是否是最长的
                if(ss.length()<sum){
                    // 如果当前的回文长度不是最长的,继续向前取字符,找下一个最长回文
                    continue;
                }
                // 到这里,说明当前的回文是最长的了,那么把最长回文做一下记录,以便与下一个回文比较
                sum = ss.length();
                result = ss;
            }
        }
        // 全部循环完毕后,返回最长回文
        return result;
    }
复制代码

小伙伴们也可以使用自己喜欢的编程语言来实现这个题目的题解哦,感谢您的阅读!


相关文章
|
8月前
|
机器学习/深度学习 人工智能 自然语言处理
魔搭社区模型速递(6.8-6.14)
魔搭ModelScope本期社区进展:1173个模型,143个数据集,76个创新应用,10 篇内容
397 0
LabVIEW 在运行时初始化数组并允许用户编辑值
LabVIEW 在运行时初始化数组并允许用户编辑值
492 0
|
8月前
|
设计模式 安全 Python
Python编程精进:正则表达式
正则表达式是一种强大的文本处理工具,用于搜索、匹配和提取模式。本文介绍了正则表达式的语法基础,如`\d`、`\w`等符号,并通过实例展示其在匹配电子邮件、验证电话号码、处理日期格式等场景中的应用。同时,文章提醒用户注意性能、编码、安全性等问题,避免常见错误,如特殊字符转义不当、量词使用错误等。掌握正则表达式能显著提升文本处理效率,但需结合实际需求谨慎设计模式。
213 2
|
11月前
|
机器学习/深度学习 人工智能 算法
传统笔触与算法洪流:AI时代的艺术创作挑战
本文探讨了传统艺术与AI技术在创作中的共生关系及其对艺术生产力的赋能。研究表明,混合工作流能显著提升效率,而传统媒介带来的“意外美学”与AI生成的跨时空意象拼接相辅相成。AI通过快速生成视觉原型、优化色彩方案和提供即用元素,极大加速创作过程。同时,人机协同可实现风格融合、逆向思维训练及动态知识网络构建,但创作者需建立风格防火墙、验证机制和价值评估体系以守住创作主权。未来艺术教育将涵盖多层能力培养,具备跨维能力的艺术家市场竞争力将大幅提升。最终,真正成功的创作者是能够融合传统与科技、让艺术回归情感表达本质的“双脑创作者”。
516 0
|
Ubuntu NoSQL Linux
Ubuntu 21.10 安装调试符号
Ubuntu 21.10 安装调试符号
931 0
在Linux中,哪些命令可以管理系统服务,如启动、停止、重启一个服务?
在Linux中,哪些命令可以管理系统服务,如启动、停止、重启一个服务?
|
网络虚拟化 网络架构 Windows
VRRP多备份组+策略路由实现主备负载
VRRP多备份组+策略路由实现主备负载
|
5G 索引
频域结构 | 带你读《5G 空口设计与实践进阶 》之十九
在频域,为满足多样带宽需求,NR 支持灵活可扩展的 Numerology。这相应也决定了 NR 在频域资源上的物理量度是可变的。
频域结构 | 带你读《5G 空口设计与实践进阶 》之十九
|
JavaScript 数据可视化 关系型数据库
小满nestjs(第二十四章 nestjs 连接数据库)
Nestjs 集成数据库,由于企业用的Mysql 居多 我们就用Nestjs 连接 Mysql
761 0
小满nestjs(第二十四章 nestjs 连接数据库)
|
算法 搜索推荐
数据结构(2)时间复杂度——渐进时间复杂度、渐进上界、渐进下界
2.1.概述 算法的基本定义: 求解问题的一系列计算或者操作。 衡量算法性能的指标: 时间复杂性 空间复杂性
1513 0