最长回文子串、回文子序列、公共子序列

来源:互联网 发布:青岛seo整站优化方案 编辑:程序博客网 时间:2024/05/16 01:16
/*一、最长回文子串(连续)1.manacher算法(见前面)2.动态规划*/bool p[100][100];for(int i=0;i<length;++i){p[i][i]==true;if(i<length-1 && s[i]==s[i+1]){p[i][i+1]=true;start=i;maxlength=2;}}for(int len=3;len<=length;++len)for(int j=0;j<length-len+1;++j){int k=j+len-1;if(s[j]==s[k] && p[j+1][k-1]){p[j][k]=true;start=j;maxlength=len;}}if(maxlength>=2)reutrn s.substr(start,maxlength);//?/*二、最长回文子序列(不连续)1.递归2.动态规划3.将字符串反转,再求两个字符串的最长公共子序列LCS*/int lps(char *s,int i,int j){if(i==j) return 1;if(i>j) return 0;if(s[i]==s[j])return lps(s,i+1,j-1)+2;elsereturn max(lps(s,i,j-1),lps(s,i+1,j));}int lpsdp(char *s,int n){int dp[n][n],tmp;int i,j;memset(dp,0,sizeof(dp));for(i=0;i<n;++i) dp[i][i]==1;for(i=1;i<n;++i)//表示i+1长的字符串{tmp = 0;for(j=0;j+i<n;++j){if(s[j]==s[j+i])tmp=2+dp[j+1][j+i-1];elsetmp=max(dp[j+1][j+i],dp[j][j+i-1]);dp[j][j+i]=tmp;}}return dp[0][n-1];}/*三、最长公共子序列(不连续)int a[100];int b[100];int lena;int lenb;1.递归2.动态规划*/int lcs(int i,int j){if(i>=lena || j>=lenb)return 0;if(a[i]==b[j])return 1+lcs(i+1,j+1);elsereturn max(lcs(i+1,j),lcs(i,j+1));}int num[100][100];//记录之间的最大值,下标从1开始int flag[100][100];//记录标记移动方向void lcsdp(){for(i=1;i<=lena;++i)for(j=1;j<=lenb;++j){if(a[i-1]==b[j-1]){num[i][j]=num[i-1][j-1]+1;flag[i][j]=1;//斜向下移动}else if(num[i][j-1]>num[i-1][j]){num[i][j]=num[i][j-1];flag[i][j]=2;//向右移动}else{num[i][j]=num[i-1][j];flag[i][j]=3;//向下移动}}//num[lena][lenb]为最大值}//获取最长公共子序列void getlcs(){char res[100];int k=0;int i=lena,j=lenb;while(i>0 && j>0){if(flag[i][j]==1){res[k++]=a[i-1];i--;j--;}else if(flag[i][j]==2)j--;elsei--;}//for(i=k-1;i>=0;--i)//cout<<res[i];}

0 0
原创粉丝点击