题目
给定一个字符串,你的任务是计算这个字符串中有多少个回文子串。
具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被计为是不同的子串。
思路
// 思路:中心扩展法,有2*n-1个中心
// 以每一个中心为中心点,向左,右两边扩展,如果s.charAt(left--) == s.chaAt(right++),则计数器加1
// for循环遍历中心点,while循环判断左右是否相等,不相等则跳出,继续下一个中心点
// 注意:while循环中,记得加上边界,要不然很容易越界
int left = center / 2;
int right = left + center % 2;
从中心往两侧延伸
一个长度为N的字符串,有2*N-1个回文中心,遍历每个回文中心,以每个回文中心为中心,一次判断回文中心的左边和右边是否相等,若相等,则继续以这个回文中心为中点扩张,直到左边不等于右边。
时间复杂度:N*2,每个回文中心都需要往左右两边扩张。
class Solution {
public int countSubstrings(String s) {
int N = s.length(), count = 0;
for(int center = 0; center <= 2*N - 1; center++) {
int left = center / 2;
int right = left + center % 2;
while(left >= 0 && right < N && s.charAt(left) == s.charAt(right)) {
count++;
left--;
right++;
}
}
return count;
}
}