你永远可以相信东哥。
给你一个字符串 s,找到 s 中最长的回文子串。 示例 1: 输入:s = "babad" 输出:"bab" 解释:"aba" 同样是符合题意的答案。 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/longest-palindromic-substring 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
寻找回文子串的核心:从中心向两边扩散判断回文串。
public static String longestPalindrome(String s) {
String res = "";
for (int i = 0; i < s.length(); i++) {
// 以 s[i] 为中心的最长回文子串
String s1 = palindrome(s, i, i);
// 以 s[i] 和 s[i+1] 为中心的最长回文子串
String s2 = palindrome(s, i, i + 1);
// res = longest(res, s1, s2)
res = res.length() > s1.length() ? res : s1;
res = res.length() > s2.length() ? res : s2;
}
return res;
}
这个函数来求最长回文串。
- 从字符串的第一个下标开始,每一个索引对应的元素都进行扩散。
- 字符串有可能长度为奇数,也可能长度为偶数
public static String palindrome(String s, int l, int r) {
// 防止索引越界
while (l >= 0 && r < s.length()
&& s.charAt(l) == s.charAt(r)) {
// 向两边展开
l--; r++;
}
// 返回以 s[l] 和 s[r] 为中心的最长回文串
return s.substring(l + 1, r);
}
这是求最长子串的函数。
- 要用到一个l 和一个r,向两边扩散要用到两个指针
- 字符串长度为奇数的话,就是有中心字符的,主要走的是
longestPalindrome得到s1的那一条语句,第二条语句返回的是空。
- 字符串长度为偶数的话,无中心字符,就需要两个元素进行扩散,主要走的是得到s2的那一条语句
总结一句话就是,中心扩散,双指针,注意是奇数串还是偶数串。
最后 完整代码加测试:
public class longestPalindrome {
public static String palindrome(String s, int l, int r) {
// 防止索引越界
while (l >= 0 && r < s.length()
&& s.charAt(l) == s.charAt(r)) {
// 向两边展开
l--; r++;
}
// 返回以 s[l] 和 s[r] 为中心的最长回文串
return s.substring(l + 1, r);
}
public static String longestPalindrome(String s) {
String res = "";
for (int i = 0; i < s.length(); i++) {
// 以 s[i] 为中心的最长回文子串
String s1 = palindrome(s, i, i);
// 以 s[i] 和 s[i+1] 为中心的最长回文子串
String s2 = palindrome(s, i, i + 1);
// res = longest(res, s1, s2)
res = res.length() > s1.length() ? res : s1;
res = res.length() > s2.length() ? res : s2;
}
return res;
}
public static void main(String[] args) {
String s = "abccba";
String s1 = longestPalindrome(s);
System.out.println(s1);
}
}