解题思路:
从中心点往两边扩散, 来寻找回文串, 即穷举每一个点为中心点
如果回文串是奇数时, 比如 "bab"
, 它的中心点就只有一个 "a"
,所以从 "a"
开始向两边扩散
如果回文串是偶数时, 比如 "baab"
, 它的中心点为 "aa"
, 所以从 "aa"
开始向两边扩散
class Solution {
public String longestPalindrome(String s) {
//记录最长回文串
String res = "";
for(int i = 0; i < s.length(); i++){
//当回文串是奇数时, 由一个中心点向两边扩散
String s1 = palindrome(s, i, i);
//当回文串是偶数时, 由中间的两个中心点向两边扩散
String s2 = palindrome(s, i, i + 1);
res = res.length() > s1.length() ? res : s1;
res = res.length() > s2.length() ? res : s2;
}
return res;
}
public String palindrome(String s, int left, int right){
while(left >= 0 && right < s.length()){
//判断两边字符是否一样
//一样的话继续分别向两边遍历
if(s.charAt(left) == s.charAt(right)){
left--;
right++;
}else{
break;
}
}
//循环结束的条件是s.charAt(left) != s.charAt(right)
//所以回文字符串应该是(left, right)之间的字符串
return s.substring(left + 1, right);
}
}
class Solution {
public int countSubstrings(String s) {
int res = 0;
for(int i = 0; i < s.length(); i++){
res = palindrome(s, i, i, res);
res = palindrome(s, i, i + 1, res);
}
return res;
}
public int palindrome(String s, int left, int right, int res){
while(left >= 0 && right < s.length()){
if(s.charAt(left) == s.charAt(right)){
left--;
right++;
res++;
}else{
break;
}
}
return res;
}
}