动态规划;
属于简单的动态规划,分两种情况,一种是字串字母为奇数个时,一种时字串字母为偶数个时。
判断一个字符串是否为回文串,只需要先判断两端是否相同,如果相同则出去两端看中间的字串是否为回文串,依次类推,直至剩下一个元素(奇数个元素)或者两个元素(偶数个字母),如果中间 都为true,那么这是一个回文串。
这个题只需要计数,那么我们就可以从字符串中的每个字母开始展开判断,像破浪一样向两端散开。然后如果是回文串则+1,然后返回和即可。
class Solution {
public:
int countSubstrings(string s) {
// 波浪向两端延申
// 首先单独一个字母是回文串
// 第二部判断这个字母两遍是否是回文串,如果是+1,遍历直到触碰到边界,或者是出现非回文串的地方停止
int count = 0;
// 奇数个数回文串
for(int i=0;i<s.size();i++){
int left = i;
int right = i;
while(left>=0&&right<s.size()&&s[left] == s[right]){
count++;
--left;
++right;
}
}
// 偶数个字母回文串
for(int i=0;i<s.size();i++){
int left = i;
int right = i+1;
while(left>=0&&right<s.size()&&s[left] == s[right]){
count++;
--left;
++right;
}
}
return count;
}
};