最长回文子串 /回文数量

最长回文子串:

#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;
}

猜你喜欢

转载自blog.csdn.net/cleveland_/article/details/89365616