坚持打卡!
题目:
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
示例 1:
输入: "babad"
输出: "bab"
注意: "aba" 也是一个有效答案。
示例 2:
输入: "cbbd"
输出: "bb"
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-palindromic-substring
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
主要思路:
1,这里我是参考帖子上面的大神的代码,进行一个逻辑的学习
2,采用中心扩展算法的方法,即:aba,来说,回文中心的两侧都是一样对应的。所以我们可以从它的中心展开,进行两侧的对比。对比的次数为:2n−1 次。
怎么得出?
回文有两种情况:
第一种,aba 类型。此时a为中心,可以作为中心的点有 n 个
第二种,abba类型。此时bb为中心,可以作为中心的点有n - 1 个
所以加起来就是 2n -1 。
3,接下来就是对两种情况进行统计,得出最大的回文子串长度,并记录中心的下标。再得到该回文子串的起始末尾的下标,对它进行输出
参考代码
/**
*
* @author SanYi
* @version leetcode-5 最长回文子串
*
*/
public class Test5 {
public static void main(String[] args) {
// 测试数据
String s = "cbAbccbAbergswegaqfcsd";
System.out.println(longestPalindrome(s));
}
/**
* 获取字符串最长的回文子串
* */
public static 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 = getLongString(s, i, i);
// 判断在两个字符为中心时候的回文长度
int len2 = getLongString(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);
}
/**
* @param s
* 字符串
* @param left
* 左边下标
* @param right
* 右边下标
* */
private static int getLongString(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++;
}
// 返回长度
return R - L - 1;
}
}
总结:
在解决的过程中,看到评论下放各种大佬给出的解答。让我深受感触,感受到各种思维在跳动,一件事情的实现绝非只有一种方式,而每一种方式都是可以不断完善的。学无止境!