给定一个字符串,你的任务是计算这个字符串中有多少个回文子串。
具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被计为是不同的子串。
示例 1:
输入: "abc" 输出: 3 解释: 三个回文子串: "a", "b", "c".
示例 2:
输入: "aaa" 输出: 6 说明: 6个回文子串: "a", "a", "a", "aa", "aa", "aaa".
注意:
- 输入的字符串长度不会超过1000。
参考这个博客https://blog.csdn.net/obrcnh/article/details/78138276
我们可不可以这样想,在遍历字符串的时候,考虑一下对每个字符进行左右扩展?(比如aaa,对中间的a进行左右扩展得到aaa)这样的话,就不需要再找子字符串再进行判断了,我们只需在遍历的时候,对每个字符的左方和右方的字符进行判断,如果相同就继续往两侧扩展直到一方到达该字符串的边界;如果不同,则直接结束循环,这样时间复杂度就有效地变成O(n^2)了。但其实上面这样做的话只考虑到了字符串长度为奇数的情况,偶数的情况没有考虑(比如aa)。但其实做法跟上面完全相同,这里我就不再细述了。两种情况相加,就是最后的结果。
class Solution {
private int count = 0;
public int countSubstrings(String s) {
if(s==null|s.length()==0)
return 0;
for (int i = 0; i < s.length(); i++) {
extend(s,i,i);
extend(s, i, i+1);
}
return count;
}
private void extend(String s,int left, int right) {
while(left>=0&&right<s.length()&&s.charAt(left)==s.charAt(right)) {
count++;
left--;
right++;
}
}
}