手撕代码:求字符串最长回文子序列

//输入字符串

//输出最长子序列长度

 1 int longestSubSeq(string ss)
 2 {
 3     int n=(int)ss.size();
 4     if(n==0)
 5     {
 6         return 0;
 7     }
 8     //申请辅助内存
 9     int **f=new int* [n];
10     for(int k=0;k<n;++k)
11     {
12         f[k]=new int[n];
13     }
14     //初始化
15     for(int i=0;i<n;++i)
16     {
17         f[i][i]=1;
18         if(i<n-1)
19         {
20             if(ss[i]==ss[i+1])
21             {
22                 f[i][i+1]=2;
23             }
24         }
25     }
26     //计算顺序
27     int len;
28     int Max=1;
29     for(len=3;len<=n;++len)
30         for(int i=0;i<=n-len;++i)
31         {
32             int j=i+len-1;
33             f[i][j]=max(f[i+1][j],f[i][j-1]);
34             if(ss[i]==ss[j])
35             {
36                 f[i][j]=max(f[i][j],f[i+1][j-1]+2);
37                 if(f[i][j]>Max)
38                 {
39                     Max=f[i][j];
40                 }
41             }
42         }
43     //释放内存
44     for (int l = 0; l <n; ++l) {
45         delete [] f[l];
46     }
47     delete []f;
48     return Max;
49 }

 

转载于:https://www.cnblogs.com/yichengming/p/11542543.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值