LCR 020. 回文子串
题目解析 - 回文子串的数量
给定一个字符串 s
,计算这个字符串中有多少个回文子串。本题的主要思路是中心扩展法,通过固定中心点然后向两侧扩散来检查回文子串。
方法概述
对于字符串中的每个字符,我们将它视为回文子串的中心点,然后向两侧扩展。需要考虑两种情况:
- 奇数长度的回文串,如 “aba”,中心是 ‘b’。
- 偶数长度的回文串,如 “abba”,中心是两个 ‘b’ 之间的虚拟位置。
解题思路
-
边界情况处理:如果输入的字符串长度为0,直接返回0。
-
遍历字符串中的每个字符,将每个字符视为可能的回文中心,分别处理奇数长度和偶数长度的回文情况。
-
回文检查函数:
countS
函数用于检查以start
和end
为中心的回文子串数量。如果start
和end
指向的字符相同,我们就继续向两边扩展,同时增加回文子串的计数。 -
累加回文子串数量:对于每个中心点,将
countS
函数返回的回文子串数量累加到总数count
上。 -
返回结果:遍历完成后,
count
即为回文子串的总数。
Java代码实现
class Solution {
public int countSubstrings(String s) {
if(s.length() == 0){
return 0;
}
int count = 0;
for(int i = 0; i < s.length(); i++){
count+= countS(s,i,i); // 奇数长度回文串
count += countS(s,i,i + 1); // 偶数长度的回文串
}
return count;
}
// 函数用于判断当前遍历位置的字符可以组成的回文串的个数
public static int countS(String s,int start,int end){
int count = 0;
// 从中间向两边扩散,比较字符是否相等
while(start >= 0 && end < s.length() && s.charAt(start) == s.charAt(end)){
count++;
start--;
end++;
}
return count;
}
}