最长回文长度

题目
给定一个字符串,求字符串中最长回文长度。例:aferegga最长回文长度为5(回文为aerea)。

解题思路
从字符串两端入手,对比两端字符,如果相等,则转向求中间所夹字符串中最长回文长度。如果不相等,则分别求除左、右端字符所剩字符串中最长回文长度,然后比较得出最长回文长度。
可以用递归或动态规划算法求解。
 
/*递归算法*/
 
Code:
  1. #include <iostream>   
  2. #include <algorithm>   
  3. #include <cstring>   
  4. using namespace std;   
  5.   
  6. int MaxLength(char str[], int i, int j)   
  7. {   
  8.     if (i == j)   
  9.     {   
  10.         return 1;   
  11.     }   
  12.     else if (i > j)   
  13.     {   
  14.         return 0;   
  15.     }   
  16.     else  
  17.     {   
  18.         if (str[i] == str[j])   
  19.         {   
  20.             return 2 + MaxLength(str, i + 1, j - 1);   
  21.         }   
  22.         else  
  23.         {   
  24.             return max(MaxLength(str, i + 1, j), MaxLength(str, i, j - 1));   
  25.         }   
  26.     }   
  27. }   
  28. int main()   
  29. {   
  30.     char str[1000];   
  31.     int len;   
  32.   
  33.     while (cin >> str)   
  34.     {   
  35.         len = strlen(str);   
  36.         cout << MaxLength(str, 0, len - 1) << endl;   
  37.     }   
  38.     return 0;   
  39. }  
 
/*动态规划*/
Code:
  1. #include <iostream>   
  2. using namespace std;   
  3. #define MAXLEN 1000   
  4. int maxlen[MAXLEN][MAXLEN];   
  5.   
  6. int LongestLen(char str[], int slen)   
  7. {   
  8.     int i, j, len;   
  9.   
  10.     for (i = 0; i < slen; i++)   
  11.     {   
  12.         maxlen[i][i] = 1;   
  13.     }   
  14.     for (len = 1; len < slen; len++)   
  15.     {   
  16.         for (i = 0; i <= slen - len; i++)   
  17.         {   
  18.             j = i + len;   
  19.             if (str[i] == str[j])   
  20.             {   
  21.                 if (i + 1 > j - 1)   
  22.                 {   
  23.                     maxlen[i][j] = 2;   
  24.                 }   
  25.                 else  
  26.                 {   
  27.                     maxlen[i][j] = 2 + maxlen[i + 1][j - 1];   
  28.                 }   
  29.             }   
  30.             else  
  31.             {   
  32.                 maxlen[i][j] = max(maxlen[i + 1][j], maxlen[i][j - 1]);   
  33.             }   
  34.         }   
  35.     }   
  36.     return maxlen[0][slen - 1];   
  37. }   
  38. int main()   
  39. {   
  40.     char str[MAXLEN];   
  41.     int slen;   
  42.   
  43.     while (cin >> str)   
  44.     {   
  45.         slen = strlen(str);   
  46.         cout << LongestLen(str, slen) << endl;   
  47.     }   
  48.     return 0;   
  49. }  

 

评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值