回文串划分

来源:互联网 发布:mysql text 最大长度 编辑:程序博客网 时间:2024/06/05 22:41
<span style="font-family: Arial, Helvetica, sans-serif;">#include<iostream></span>
#include<vector>#include<string>#include<cmath>using namespace std;int strDivided(string &s){int n=s.length();
<span style="font-family: Arial, Helvetica, sans-serif;"><span style="white-space:pre"></span>//dp[i][j]代表字符串i-j是否为回文串</span>
vector<vector<int>> dp(n,vector<int>(n,0));
<span style="white-space:pre"></span>//num[i]代表0-i子串中最少回文串划分vector<int> num(n,0);for(int i=0;i!=n;i++){dp[i][i]=1;if(i!=n-1&&s[i]==s[i+1]){dp[i][i+1]=1;}}for(int i=0;i!=n;i++){num[i]=i+1;}for(int r=3;r<=n;r++){int k=n-r;for(int i=0;i<=k;i++){if(s[i]==s[i+r-1]&&dp[i+1][i+r-2]){dp[i][i+r-1]=1;}}}for(int i=0;i!=n;i++){if(i!=0){num[i]=min(num[i],num[i-1]+1);}for(int j=i+1;j!=n;j++){if(s[i]==s[j]&&(j-i<3||dp[i+1][j-1])){if(i==0){num[j]=1;}else{num[j]=min(num[j],num[i-1]+1);}}}}return num[n-1];}int main(){string s;cin>>s;cout<<strDivided(s)<<endl;return 0;}


                                             
0 0