首页 > 其他分享 >leet code 5. 最长回文子串

leet code 5. 最长回文子串

时间:2023-11-07 17:33:51浏览次数:48  
标签:leet code radious int 半径 build 字符串 回文

5. 最长回文子串

题目描述

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

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

示例 1:

输入:s = "babad" 输出:"bab"

解释:"aba" 同样是符合题意的答案。


示例 2: 输入:s = "cbbd" 输出:"bb"


提示:

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


题目解析--Manacher算法

重构字符串

  • 以示例1为例,字符串 s = "babad"
  • 可被重构为 s = "!#b#a#b#a#d#@"
  • 为什么重构?
  • 为了保证被处理的字符串的长度一定是偶数

计算字符对应回文半径

重构后的字符 s = "!#b#a#b#a#d#@"

! # b # a # b # a # d # @    : 可以计算该字符串的回文半径
0 0 1 0 3

计算到字符 a 的时候,可以得到其回文半径长为 3
! # b # a # b # a # d # @    
0 0 1 0 3 ^

计算  a 下一个字符 # 的回文半径的时候可以利用之前的计算——如下图

leet code 5. 最长回文子串_最长回文子串

  • 以 a 为中心点,左右两边的字符是对称的,左边字符的回文半径已经计算得出
  • 对称点的回文半径 = min(左边对称点的回文半径,右边界减去当前索引位置)
  • 因为不能超过右边界

计算最终结果

  • 1 、2 步可以得到回文中心点,和回文半径
  • 再次遍历字符串得到最长回文子串

show code

class Solution {
    public String longestPalindrome(String s) {
        // 第一步,重新构造 字符串 s,使其变成 偶数长度
        StringBuilder build = new StringBuilder("!#");
        int len = s.length();
        for(int i = 0;i < len;i++) {
            build.append(s.charAt(i));
            build.append('#');
            if(i == len - 1) {
                build.append('@');
            }
        }
        int n = build.length();
        // 半径数组.
        int[] radious = new int[n];
        int c = 0,r = 0;
        // 从第三个字符开始遍历.
        for(int i = 2;i < n - 2;i++) {
            if(i < r) {
                // r :当前计算出的最长回文半径,这里的最长是指 r 对应索引的大小
                radious[i] = Math.min(r - i, radious[2*c - i]);
            }

            while(build.charAt(i - radious[i]) == build.charAt(i + radious[i])) {
                radious[i]++;
            }

            if(i + radious[i] > r) {
                r = i + radious[i];
                c = i;
            }
        }
        r = 0;
        int max = 0;
        for(int i = 2;i < n - 2;i++) {
            if(radious[i] > r) {
                r = radious[i];
                max = i;
            }
        }
        StringBuilder ans = new StringBuilder();
        for(int i = max - r + 1;i < max + r;i++) {
            if(build.charAt(i) != '#') {
                ans.append(build.charAt(i));
            }
        }
        return ans.toString();
    }
}

标签:leet,code,radious,int,半径,build,字符串,回文
From: https://blog.51cto.com/u_16079703/8237516

相关文章

  • AtCoder Beginner Contest 327 (ABC327)
    A.ab直接根据题意模拟即可。CodeB.A^A直接枚举\(i=1,2,\dots,15\),每次看看\(i^i\)是否等于\(A\)即可。CodeC.NumberPlaceDescription给你一个\(9\times9\)的矩阵\(A\),判断是否合法,满足以下三个条件,即为合法。对于每一行,包含数字\(1\sim9\);对于......
  • AtCoder Beginner Contest(abc) 319
    B-Measure难度:⭐题目大意给定一个数N,我们要求输出长度为n+1的一个序列Si(i从0到n),对于Si,如果存在j(j从1~9)是N的一个除数,并且i是N/j的一个倍数,那么Si就是满足条件的最小的j,如果没存在就输出'-';解题思路数据不大,暴力即可;神秘代码#include<bits/st......
  • BUUCTF_Crypto_WriteUp | Unencode
    题目89FQA9WMD<V1A<V1S83DY.#<W3$Q,2TM]分析该题没给提示,标题也很奇怪,猜测是一种名为Unencode的加密方式,查了一下只找到UUencode编码UUENCODE是将二进制文件转换为文本文件的过程,转换后的文件可以通过纯文本e-mail进行传输,在接收方对该文件进行uudecode,即将其转换为初始......
  • swift之xcode升级后由于pod库导致项目报错的解决方案
    将以下代码贴到Podfile文件里#FixXcode14Bundletargeterrorpost_installdo|installer|  installer.pods_project.targets.eachdo|target|    target.build_configurations.eachdo|config|      config.build_settings['EXPANDED_CODE_SIGN......
  • 渗透中 PoC、Exp、Payload、RCE、IOC,Shellcode 的区别
    PoC:全称“ProofofConcept”,中文“概念验证”,常指段漏洞证明的代码。Exp:全称“Exploit”,中文“利用”,指利用系统漏洞进行攻击的动作作。Payload:中文“有效载荷”,指成功exploit之后,真正在目标系统执行的代码或指令RCE:RCE(remotecommand/codeexecute)可以让攻击......
  • vscode快捷输入vue2,vue3,模板
    { //Placeyoursnippetsforvuehere.Eachsnippetisdefinedunderasnippetnameandhasaprefix,bodyand //description.Theprefixiswhatisusedtotriggerthesnippetandthebodywillbeexpandedandinserted.Possiblevariablesare: //$1,......
  • CodeWhisperer 的正确使用
    1、重点:重点1: 推出AmazonBedrock。这项新服务允许用户通过API访问来自AI21Labs、Anthropic、StabilityAI和亚马逊的基础模型。(Anthropic就是之前跟ChatGPT掰手腕的Claude的模型。StabilityAI就是StableDiffusion背后的公司。)重点2: CodeWhisperer对所有个人......
  • AtCoder Beginner Contest 327
    A-ab题意:判断字符串中是否有“ab”或者是“ba“#include<bits/stdc++.h>usingnamespacestd;voidsolve(){ intn; cin>>n;strings; cin>>s; if(s.find("ab")!=s.npos||s.find("ba")!=s.npos){ cout<<"Yes"; }else{......
  • Codeforces Visit
    CodeforcesVisit记录一下自己大概vis了那几场??随机补题大法好!CF632Div.2飞速模拟出ABC。优势在我!CF1333D发现就是把字符串变成LLRR此类形状。所以开头必然是L啊,然后我们考虑先把L换到第一个。发现必然是LLLLLLLLLLLRRRRRRRR啊,很快啊,不会了。CF1333E你妈妈con......
  • AtCoder Beginner Contest(abc) 318
    B-Overlappingsheets难度:⭐题目大意在一个坐标系中给出覆盖多个矩形,问最后所有矩形覆盖的总面积是多少;解题思路坐标系的范围不大,标记后遍历即可;还是要注意给的是坐标系的点,计算的是边;神秘代码#include<bits/stdc++.h>#defineintlonglong#define......