剑指 Offer II 020. 回文子字符串的个数
给定一个字符串 s ,请计算这个字符串中有多少个回文子字符串。
具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串。
输入:s = “abc”
输出:3
解释:三个回文子串: “a”, “b”, “c”
先找出回文中心,然后再向两边进行扩展,如果扩展过程中两个指针所指的元素相等时就说明找到了一个回文子串。
注意:单个字符当然也要算作在内。
当字符串长度为3时,两个回文中心分别是:(0,0)(0,1)(1,1)(1,2)(2,2),一共2*n-1种情况;
其中左/右侧指针与i的关系:left=i/2,right=left+i%2
注意:最终结束的条件是左指针小于0,或者右指针大于n时;
当遇到左右侧指针对应的元素不相等时就说明该跳出当前while循环,否则就有可能导致一直在while循环里出不来。
class Solution {
public int countSubstrings(String s) {
int ans = 0;
int n=s.length();
for(int i=0;i<2*n-1;i++){
int left=i/2,right=i/2+i%2;
while(left>=0&&right<n){
if(s.charAt(left)==s.charAt(right))
{left--;
right++;
ans++;
}
else
break;
}
}
return ans;
}
}