【题目描述】
给定一个字符串s,找到s中的所有回文子串(Palindromic Substring);
只需输出回文子串的数目,并去掉重复的子串。
【输入格式】
一行,字符串s
【输出格式】
一个数字,表示回文子串个数
【样例输入】
bb
bca
aa
(没有空行 发布不让三个a或者三个b连在一起)
【样例输出】
7
【样例解释】
一共7个不重复的回文子串
【数据范围】
对于100%的数据:1<=|s|<=5000,且s仅仅含有小写字母。
#include <iostream>
#include <string.h>
#include <set>
using namespace std;
bool IsPalindromicStr(string str) {
for (int i = 0; i < str.size()/2; ++i) {
if (str[i] != str[str.size() - 1 - i]) return false;
}
return true;
}
int countPalindromicSubstr(string str) {
set<string> s;
for (int i = 0; i<str.size(); i++) {
for (int j = 1; j< str.size()+1-i; j++) {
string substring = str.substr(i, j);
if (IsPalindromicStr(substring)) {
s.insert(substring);
};
}
}
return s.size();
}
int main()
{
string testStr;
cout << "Enter string: " << endl;
cin >> testStr;
cout << countPalindromicSubstr(testStr) << endl;
}
bbbcaaa怎么会有7个不重复的回文字串呢???单个字符算不算啊?
#include<iostream>
using namespace std;
#include <vector>
#include <string>
void rev(string &s)
{
int len = s.size();
for(int i=0;i<len/2;i++)
{
char c = s[i];
s[i] = s[len-i-1];
s[len-i-1] = c;
}
}
int main()
{
vector<string> vs;
string s,s1,s2;
cin>>s;
for(int i=1;i<=s.size();i++)
{
for(int j=0;j<=s.size()-i;j++)
{
s1=s2=s.substr(j,i);
rev(s1);
if(s1==s2)
{
vector<string>::iterator it;
for(it = vs.begin();it != vs.end();it++)
{
if(*it == s1)
break;
}
if(it == vs.end())
vs.push_back(s1);
}
}
}
printf("%d",vs.size());
return 0;
}