问题 V: 统计回文子串
时间限制: 1 Sec 内存限制: 32 MB
提交: 102 解决: 32
题目描述
现在给你一个字符串S,请你计算S中有多少连续子串是回文串。
输入
输入包含多组测试数据。每组输入是一个非空字符串,长度不超过5000。
输出
对于每组输入,输出回文子串的个数。
样例输入 Copy
aba aa
样例输出 Copy
4 3
代码
提示:
- 原先我的做法,单边拓展,奇偶情况统一,计算量很大
- 新角度:降低时间复杂度和空间复杂度->奇数和偶数位像两边拓展(保证每次走过的都算数且不重复)
- 另一个解题角度:动态规划
#include <string>
#include <iostream>
#include <algorithm>
using namespace std;
int CountSubstrings(string s){
int n=s.length(),countRes=0;
for(int i = 0;i < n;i++){
int begin=i,end=i; //奇数位拓展,起点相同
while(begin>=0&&end<n){
if(s[begin]==s[end]){
countRes++;
begin--;
end++;
}
else{
break;
}
}
begin=i;
end=i+1; //偶数位拓展,起点相隔
while(begin>=0&&end<n){
if(s[begin]==s[end]){
countRes++;
begin--;
end++;
}
else{
break;
}
}
}
return countRes;
}
int main(){
string s;
long int num=0;
while(cin>>s){
num=CountSubstrings(s);
cout<<num<<endl;
}
}