LC5.最长回文字串[通俗易懂]
通俗易懂 最长 lc5
2023-06-13 09:12:40 时间
大家好,又见面了,我是你们的朋友全栈君。
中心扩展法
主要思路是每次选一个中点,然后向两边扩展,找出以该中点对应的最长的回文串的长度,然后维护一个全局的最长回文串长度变量。
对于奇偶数长度的不同处理方式:
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.cn/164003.html原文链接:https://javaforall.cn
相关文章
- 数据结构——线索化二叉树和哈夫曼树[通俗易懂]
- 动态规划应用–最长递增子序列 LeetCode 300[通俗易懂]
- ASMM自动管理的功能[通俗易懂]
- (一)手把手教双目相机标定(超详细,附代码)[通俗易懂]
- Leetcode 5:最长回文子串(最详细的解法!!!)[通俗易懂]
- 小明の魔法计划——最长上升子序列[通俗易懂]
- ubuntu中使用Deb安装VS Code[通俗易懂]
- 开源Fast R-CNN代码实现物体识别[通俗易懂]
- 如何在mac上查看gcc版本号[通俗易懂]
- matlab中wavedec2,wavedec2函数详解[通俗易懂]
- ftp服务器文件防盗链,IIS防盗链组件[通俗易懂]
- 关于RuntimeException[通俗易懂]
- Django(17)orm查询操作[通俗易懂]
- (怪盗基德的滑翔翼)(最长上升子序列)[通俗易懂]
- 【STM32】HAL库 STM32CubeMX教程九—ADC[通俗易懂]
- 格雷码与二进制的转换[通俗易懂]
- win10 命令行进入指定目录方法[通俗易懂]
- C语言中从键盘输入字符串时的一些问题[通俗易懂]