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

5.6如何寻找最长回文子串

5.6 如何寻找最长回文子串

5.6.1 问题分析

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

  • 一般来说,由于回文串结构的特殊性,解决这种问题的核心是双指针

样例分析:输入s=acaba,那么算法应该要返回aca或者aba

当拿到题目没有思路的时候,不妨先从局部入手,从局部逐步推导达到最优解

  • 给定一个字符串s,如何在s中找到一个回文子串?既然回文串是一个正着读和反着读都是一样的字符串,那么如果把s反转,我们称为s',然后在ss'中寻找最长公共子串,这样应该就能找到最长的回文子串
    • 这个思路的思维点:
    • 首先抓住回文串正着读和反着读的这个特点,假如我们将raw字符串给反转,那么存在于raw字符串中的回文子串,一定也存在于raw'之中,而且两者一模一样
    • 其次,我们要寻找最长的回文子串,那么只需要找两个字符串的最长公共子串就可以了
  • 这个思路听起来似乎很有道理,但是其实对于回文串的定义的识别是不准确的,我们给出两个样例:aacxycaa,它反转之后是aacyxcaa,我们使用算法寻找出其最长公共子串是aac或者caa
  • 这显然不符合回文串的规定,回到最原始的定义,正着读和反着读都一样,那么上面这个思路为什么错呢?这是因为这个思路扩大了回文串的定义范围,一个解决办法是找出所有的公共子串,然后使用回文串判别算法来一个个筛选,但是很显然,时间复杂度要达到O(N^2)

5.6.2 正确思路

  • 寻找回文串的核心思想:从中间开始向两边扩散来判断回文串
for(int i = 0;i<s.length();i++){
    //找到以s[i]为中心的会问串
    //根据找到的回文串长度来更新答案
}
for(int i = 0;i<s.length();i++){
    //找到以s[i]为中心的回文串
    //找到以s[i]和s[i+1]为中心的回文串[i+1]可能越界
   	//更新答案
}

5.6.3 代码实现

    public String longestPalindrome(String s) {
        String res = "";
        for(int i = 0;i<s.length();i++){
            String s1 = palindrome(s, i, i);
            String s2 = palindrome(s, i, i + 1);
            res = res.length()>s1.length()?res:s1;
            res = res.length()>s2.length()?res:s2;
        }
        return res;
    }
    //从s[l]和s[r]开始向两端扩散
    //返回以s[l]和s[r]为中心的最长回文串
    //同时传入l和r,便于处理中心点不在同一个点的情况
    //当l和r相等的时候,就是在寻找长度为奇数的回文串
    //当r=l+1的时候,就是在寻找长度为偶数的回文串
    private String palindrome(String s,int l,int r){
        //防止索引越界
        while (l>=0 && r<s.length() && s.charAt(l) == s.charAt(r)){
            l--;r++;
        }
        return s.substring(l+1,r);
    }

相关文章:

  • tkinter-event事件
  • Windows10环境gradle安装与配置
  • DELMIA弧焊虚拟仿真:带变位机的机器人弧焊焊接程序自动生成方法
  • Redis 非关系型数据库学习(三)---- Redis 基础知识
  • 离线数仓(2):数据仓库相关架构和规范
  • MySQL-数据类型和DDL
  • Linux学习笔记6 - 系统启动流程
  • 动态数组写模板类
  • 代码错误与检查简短教程(新手适用)
  • Java Design Patterns 之API 网关模式
  • vue框架的基础语法之方法和事件的绑定,样式绑定,循环渲染,条件渲染
  • 项目第一天
  • go get 拉取报错The project you were looking for could not be found的解决方法
  • 算法题练习——NC15 求二叉树的层序遍历、NC88 寻找第K大
  • java基于springboot+vue的汉服推广与交流平台
  • Akka系列(七):Actor持久化之Akka persistence
  • gops —— Go 程序诊断分析工具
  • GraphQL学习过程应该是这样的
  • HTTP 简介
  • js操作时间(持续更新)
  • MobX
  • Object.assign方法不能实现深复制
  • Rancher-k8s加速安装文档
  • spring security oauth2 password授权模式
  • uva 10370 Above Average
  • 试着探索高并发下的系统架构面貌
  • 一份游戏开发学习路线
  • 用element的upload组件实现多图片上传和压缩
  • 原生Ajax
  • CMake 入门1/5:基于阿里云 ECS搭建体验环境
  • k8s使用glusterfs实现动态持久化存储
  • 曜石科技宣布获得千万级天使轮投资,全方面布局电竞产业链 ...
  • ​ubuntu下安装kvm虚拟机
  • #QT(智能家居界面-界面切换)
  • (附源码)ssm教材管理系统 毕业设计 011229
  • (机器学习-深度学习快速入门)第三章机器学习-第二节:机器学习模型之线性回归
  • (转) Face-Resources
  • (转)IIS6 ASP 0251超过响应缓冲区限制错误的解决方法
  • (转载)CentOS查看系统信息|CentOS查看命令
  • .NET Micro Framework初体验(二)
  • .NET Remoting Basic(10)-创建不同宿主的客户端与服务器端
  • .net 按比例显示图片的缩略图
  • .NET 表达式计算:Expression Evaluator
  • .Net 转战 Android 4.4 日常笔记(4)--按钮事件和国际化
  • .net企业级架构实战之7——Spring.net整合Asp.net mvc
  • .NET企业级应用架构设计系列之开场白
  • .NET中winform传递参数至Url并获得返回值或文件
  • [20190401]关于semtimedop函数调用.txt
  • [ACM] hdu 1201 18岁生日
  • [AutoSar]BSW_Memory_Stack_003 NVM与APP的显式和隐式同步
  • [BZOJ1053][HAOI2007]反素数ant
  • [BZOJ2208][Jsoi2010]连通数
  • [C语言]——函数递归
  • [emacs] CUA的矩形块操作很给力啊
  • [IE编程] IE中使网页元素进入编辑模式