Chinaunix首页 | 论坛 | 博客
  • 博客访问: 502739
  • 博文数量: 184
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1172
  • 用 户 组: 普通用户
  • 注册时间: 2016-06-21 13:40
个人简介

技术改变命运

文章分类

全部博文(184)

文章存档

2020年(16)

2017年(12)

2016年(156)

我的朋友

分类: C/C++

2016-07-01 16:17:20

给定一个字符串s,你可以从中删除一些字符,使得剩下的串是一个回文串。如何删除才能使得回文串最长呢?
输出需要删除的字符个数。
思路:将原字符串反转,求出元字符串与反转字符串最长公共子序列(也就是最长的回文串);
c++代码(网上搜的):

点击(此处)折叠或打开

  1. #include <bits/stdc++.h>
  2. using namespace std;

  3. const int MAXN=1010;
  4. int dp[MAXN][MAXN];

  5. class Solution
  6. {
  7. public:
  8.    int solve(string &s)
  9.    {
  10.        return s.length()-getLCS(s);
  11.    }

  12.    int getLCS(string &s1)
  13.    {
  14.        string s2(s1);
  15.        reverse(s2.begin(),s2.end());
  16.        int len=s1.length();
  17.        memset(dp,0,sizeof dp);
  18.        for(int i=0;i<len;++i)
  19.        {
  20.            for(int j=0;j<len;++j)
  21.            {
  22.                if(s1[i]==s2[j])
  23.                    dp[i+1][j+1]=dp[i][j]+1;
  24.                else dp[i+1][j+1]=max(dp[i][j+1],dp[i+1][j]);
  25.            }
  26.        }
  27.        return dp[len][len];
  28.    }
  29. };

  30. int main()
  31. {
  32.    string s;
  33.    while(cin>>s)
  34.    {
  35.        Solution solution;
  36.        cout<<solution.solve(s)<<endl;
  37.    }
  38.    return 0;
  39. }


c语言代码:

点击(此处)折叠或打开

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>
  4. void reverse(char *str,int from,int to)
  5. {
  6.     while (from < to)
  7.     {
  8.         char temp = str[from];
  9.         str[from++] = str[to];
  10.         str[to--] = temp;
  11.     }
  12. }
  13. int getLcs(char *str1,char *str2,int length)
  14. {
  15.     //printf("%s %s\n",str1,str2);//居然是一样的
  16.     int dp[length][length];
  17.     int i =0,j = 0;
  18.     for (i = 0;i <length;i++)
  19.     {
  20.         for (j = 0;j < length;j++)
  21.             dp[i][j] = 0;
  22.     }
  23. //    int i = 0,j = 0;
  24.     for (i = 0;i < length;i++)
  25.     {
  26.         for (j = 0;j < length;j++)
  27.         {
  28.             if (i == 0 || j == 0)
  29.             {
  30.                 if (str1[i] == str2[j])
  31.                 {
  32.                     dp[i][j] = 1;
  33.                 }
  34.                 else
  35.                 {
  36.                     if (i > 0)
  37.                         dp[i][j] = dp[i-1][j];
  38.                     if (j > 0)
  39.                         dp[i][j] = dp[i][j-1];
  40.                 }
  41.             }
  42.             else if (str1[i] == str2[j])
  43.             {
  44.                 dp[i][j] = dp[i-1][j-1]+1;
  45.             }
  46.             else {
  47.                 dp[i][j] = ((dp[i-1][j] > dp[i][j-1]) ?dp[i-1][j]:dp[i][j-1]);
  48.             }
  49.         }
  50.     }
  51.     return dp[length-1][length-1];
  52. }
  53. int main()
  54. {
  55.     char str[1024];//注意下字符串指针
  56.     //char *str1 = "abcda";
  57.     //char *str2 = "adcba";
  58.     
  59.     while (gets(str))
  60.     {
  61.         int len = strlen(str);
  62.         char str1[1024];
  63.     //    char *str1 = str;
  64.     //    printf("str1 = %s\n",str1);
  65.         
  66.         strcpy(str1,str);
  67.         reverse(str,0,len-1);

  68.         
  69.         //printf("str2 = %s\n",str2);
  70.         int result = getLcs(str1,str,len);

  71.         printf("%d\n",(len-result));
  72.         //free(str2);
  73.     }
  74.     return 0;
  75.     //getLcs()
  76.     
  77. }


阅读(1529) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~