LC5.最长回文字串[通俗易懂]

LC5.最长回文字串[通俗易懂]中心扩展法主要思路是每次选一个中点,然后向两边扩展,找出以该中点对应的最长的回文串的长度,然后维护一个全局的最长回文串长度变量。对于奇偶数长度的不同处理方式:expandAroundCenter方法中如果传入同一个点的索引,则表示以该点为中心,对应着探索字符串长度为奇数的情况如果传入两个点的索引,则表示以这两个点之间为中心,对应着探索字符串长度为偶数的情况/***@Classn…

大家好,又见面了,我是你们的朋友全栈君。

中心扩展法

主要思路是每次选一个中点,然后向两边扩展,找出以该中点对应的最长的回文串的长度,然后维护一个全局的最长回文串长度变量。

对于奇偶数长度的不同处理方式:

  • expandAroundCenter方法中如果传入同一个点的索引,则表示以该点为中心,对应着探索字符串长度为奇数的情况
  • 如果传入两个点的索引,则表示以这两个点之间为中心,对应着探索字符串长度为偶数的情况
/** * @Classname Solution5 * @Description TODO * @Date 2019/12/9 9:45 * @Created by Cheng */
public class Solution5 { 
   
    /** * 中心扩展法 * @param s * @return */
    public String longestPalindrome(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++;
        }
        // 注意此时L和R都已经在有效范围外,所以长度是R-L-1
        return R - L - 1;
    }

}

马拉车

具体思路有必要单独写一篇

/** * @Classname Solution5 * @Description TODO * @Date 2019/12/9 9:45 * @Created by Cheng */
public class Solution5 { 
      
    /** * 马拉车 * @param s * @return */
    public static String longestPalindrome2(String s) { 
   
        //处理字符串
        List<Character> list = new ArrayList<>();
        for (int i = 0; i < s.length(); i++) { 
   
            list.add('#');
            list.add(s.charAt(i));
        }
        list.add('#');
        int[] dp = new int[list.size()];
        int resLen = 0;
        int resCenter = 0;
        int maxR = 0;
        int maxM = 0;

        for (int i = 1; i <list.size() ; i++) { 
   
            dp[i] = maxR>i?Math.min(dp[maxM*2-i],maxR-i):1;
            while((i-dp[i])>=0 && (i+dp[i])<list.size() && list.get(i+dp[i]) == list.get(i-dp[i]))
                dp[i]++;
            if (i + dp[i] > maxR) { 
   
                maxR = i+dp[i];
                maxM = i;
            }
            if (resLen < dp[i]) { 
   
                resLen = dp[i];
                resCenter = i;
            }
        }
        StringBuilder ret = new StringBuilder();
        for (int i = resCenter-resLen+1; i <=resCenter+resLen-1 ; i++) { 
   
            if(list.get(i)!='#')
                ret.append(list.get(i));
        }
        return ret.toString();
    }
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/164003.html原文链接:https://javaforall.net

(0)
上一篇 2022年7月24日 上午6:36
下一篇 2022年7月24日 上午6:46


相关推荐

  • 可视化安装OpenClaw,接入微信帮干活(保姆级教程)

    可视化安装OpenClaw,接入微信帮干活(保姆级教程)

    2026年3月16日
    2
  • 业务架构浅谈_业务架构和系统架构

    业务架构浅谈_业务架构和系统架构一、序章  一般的工程师接触到的是应用架构,传统的MVC分层架构、事件驱动架构等等。第一次接触业务架构这个概念是在来到商品发布团队之后。商品发布是一个业务属性很重的系统,承载了淘宝、天猫、盒马、魅力惠、汽车、虚拟、SCM自营、苹果、村淘、公益、教育等诸多业务(业务多的围起来可以绕地球一圈)的商品发布功能。头半年对“业务架构”还是很懵逼的,随着慢慢的熟悉业务,研究框架代码,才对我们的业务架构………

    2022年10月10日
    5
  • Django 模型_django反向生成model

    Django 模型_django反向生成model前言随着项目越来越大,采用写原生SQL的方式在代码中会出现大量的SQL语句,那么问题就出现了:1.SQL语句重复利用率不高,越复杂的SQL语句条件越多,代码越长。会出现很多相近的SQL语句。2.

    2022年7月29日
    9
  • django drf_django 消息队列

    django drf_django 消息队列前言我们上篇文章使用到了Serializer类,可能有小伙伴说太过复杂,那么本篇就为大家带来更加简便的序列化类ModelSerializerModelSerializer先来看下ModelSer

    2022年7月31日
    10
  • PHP制作回合制游戏,回合制游戏脚本制作采集思路

    PHP制作回合制游戏,回合制游戏脚本制作采集思路PassWord PassWord Mid PWstr i 1 NextiText1 Text PassWord 在文本框内显示密码第一个页面 SubHello Document All myScriptlet HelloEndSubT text x scriptlet DATA 2 htm HEIGHT 0 WIDTH 0 gt 2 htm 里的源码 Subpublic

    2026年3月18日
    2
  • pycharm安装tensorflow等各种三方库失败,解决方案[通俗易懂]

    pycharm安装tensorflow等各种三方库失败,解决方案[通俗易懂]参考以下三个回答:https://blog.csdn.net/xiao_xian_/article/details/88181845解决pycharm导入三方库得方法https://blog.csdn.net/weixin_41923961/article/details/86584683解决pycharm+anaconda环境导入方法https://blog.csdn.ne…

    2022年8月26日
    8

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号