题目
求一个字符串中其所有子字符串是回文的个数。例如
- “aaa”,其子字符串是回文的包括:a,a,a,aa,aa,aaa.
- “abcba", 是回文的子字符串包括:a,b,c,bcb,abcba,b,a
解题思路
原题可以拆分成几个小问题:
- 如何得到子字符串?
- 求回文个数?
子字符串
求子字符串。第一种方法是,之前我们是从字符串两端开始,向里移动双指针,判断区间内是否有回文。而这里我们要采用第二种方法,又字符串中心向外扩散,来求回文。
回文个数
例如字符串s = “abcba”,我们以c中心,指针向左右各移动1位, 得到子字符串“bcb”, 于是我们可知这个是一个回文,长度为3. 接着继续向左右方向移动指针,得到新的回文abcba。
需要注意是,中心点的确立。如果回文的长度是奇数,那么子字符串中心只有一个字符;同理如果回文的长度是偶数,那子字符串中心有两个字符。
按照以上思路,我们可以得出以下代码:
代码
class Solution {
public int countSubstrings(String s) {
if(s == null || s.length() == 0) {
return 0;
}
int count = 0;
for(int i = 0; i < s.length(); i++) { //枚举字符串每个字符,从左到右。
//以各点为中心,向左右散开求回文。
count += countPalidrome(s, i, i); //确认中心点
count += countPalidrome(s, i, i + 1); //考虑回文长度为偶数的情况,确认中心点为两个数
}
return count;
}
private int countPalidrome(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;
}
}
总结
求子字符串回文个数。 可以采取以子字符串中心,向外扩散的方式,移动指针来求回文的个数。需要注意中心点的选取分成回文长度是偶数和奇数两种情况。