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();
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • SSH+activity工作流集成开发「建议收藏」

    SSH+activity工作流集成开发「建议收藏」一直没有更新最近,把以前的资料整理下。SSH的集成配置清查看上一篇struts-2.3.24+spring-framework-4.1.6.RELEASE+hibernate-release-4.3.10.Final集成开发导入activity工作流需要的jaractiviti-bpmn-converter-5.16.4.jaractiviti-bpmn-layout-5

  • 双边滤波——原理及matlab实现

      思维闭塞时可外出采采风。1、双边滤波简介:   双边滤波(Bilateral filter)是一种非线性滤波方法(空间权值+相似权值)——空间权值:模糊去噪;相似权值:保护边缘。2、双边滤波原理  双边滤波具有两个权重:空间权重与相似权重  1)空间权重:与像素位置有关,为像素之间的距离(欧式距离,空间度量),故可定义为全局变量放在循环外,通常定义为…

  • linux(4)Linux 文件内容查看「建议收藏」

    linux(4)Linux 文件内容查看「建议收藏」查看文件内容总览cat由第一行开始显示文件内容tac从最后一行开始显示,可以看出tac是cat的倒着写!nl显示的时候,顺道输出行号!more一页一页的显示文件内容less

  • checking for ZTS… configure: error: pthreads requires ZTS, please re-compile PHP with ZTS enabled

    checking for ZTS… configure: error: pthreads requires ZTS, please re-compile PHP with ZTS enabled

  • pycharm中使用anaconda部署python环境_pycharm怎么用anaconda的环境

    pycharm中使用anaconda部署python环境_pycharm怎么用anaconda的环境每一种语言的开发环境都是包含了运行环境和开源包两个核心内容。比如Java,JDK是运行环境,而开发导入需要用到的各种第三方工具都是以开源包的形式导入的。再比如Python,python3.6/python2.7是它的运行环境,而pynum,pandas这些数据处理工具就是也是开源包。通常情况下,我们都是使用IDE在项目中统一管理运行环境和开源包。比如开发JavaWeb项目我们使用Myec…

  • ASPCMS 错误号:-2147467259 解决办法

    ASPCMS 错误号:-2147467259 解决办法运行网站的时候,居然提示:提示:【】错误号:-2147467259错误描述:未指定的错误其实说白了,出现这种情况,就是权限问题,解决方法如下:A、打开系统目录下的windows/temp属性;(注意:这里是temp文件夹的属性)B、切换到安全标签,在安全标签里面的所有用户组,你都赋予完全控制权限就OK了;如果没有出现安全选项标签的话,请根据以下方法让安全标签出现:1、打开“我的电脑”→工具菜单→文件夹选项→取消“使用简单文件夹共享”前面的打钩√…

发表回复

您的电子邮箱地址不会被公开。

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