最长回文子串:
#include<iostream>
#include<string>
#include<vector>
using namespace std;
int LongPalindrmSubstring(string &a){
int len = a.length();
vector<vector<int>> dp(len,vector<int>(len,0));//初始化
for(int i = 0;i<len;i++){
dp[i][i] = 1;
}
int max_len = 1;
int start_index = 0;
for(int i = len-2; i>=0; i--){
for(int j = i+1;j<len;j++){
if(a[i] == a[j]){
if(j - i == 1)
dp[i][j] = 2;
else{
if(j-i>1){
dp[i][j] = dp[i+1][j-1] + 2;
}
}
if(max_len < dp[i][j]){
max_len = dp[i][j];
start_index = i;
}
}
else{
dp[i][j] =0 ;
}
}
}
cout<<"max_len is "<<max_len<<endl;
cout<<"start index is "<<start_index <<endl;
return max_len;
}
int main(){
string s = "asdfdsajjkkg";
cout<<LongPalindrmSubstring(s)<<endl;
return 0;
}
回文子串数量:
#include<iostream>
#include<string>
#include<vector>
using namespace std;
int print_substr(vector<vector<int>> dp,string a){
int len = a.length();
int count = 0;
cout<<"所有的回文子串为:"<<endl;
for(int i = len - 1; i>=0 ;i--){
for(int j = i ;j<len;j++){
if(dp[i][j] != 0){
cout<<a.substr(i,j+1)<<'\t';
count++;
}
}
}
cout<<endl;
return count;
}
void PrintPalindrmSubstring(string &a){
int len = a.length();
vector<vector<int>> dp(len,vector<int>(len,0));//初始化
for(int i = 0;i<len;i++){
dp[i][i] = 1;
}
for(int i = len-2; i>=0; i--){
for(int j = i+1;j<len;j++){
if(a[i] == a[j]){
if(j - i == 1)
dp[i][j] = 2;
else{
if(j-i>1){
dp[i][j] = dp[i+1][j-1] + 2;
}
}
}
else{
dp[i][j] =0 ;
}
}
}
int count = print_substr(dp,a);
cout<<"总共的回文数量为:"<<count<<endl;
}
int main(){
string s = "asa";
PrintPalindrmSubstring(s);
return 0;
}