说一下前天腾讯实习的笔试题--字符串回文问题(动态规划)

题目描述

最长回文子序列:

一个给定的字符串,求其最长回文子序列的长度;

一个回文子序列定义为原字符串的一个子序列去掉某些字符后生成的字符串为一个回文字符串;

例如cabbeaf:回文子序列有:c,a,aa,bb,,aba,abba,e,f,最长的就是abba,所以输出长度为4。

解题思路:

该问题为一个典型的动态规划问题,原串和反转串的最长公共子序列的长度即为该问题的解。

我实现的代码如下(我还多写了一些代码,用递归的方法来求解出了最长公共子序列的字符串):

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 #include <string.h>
  4
  5 #define MAX_LEN 1000 + 10
  6
  7 int result[MAX_LEN][MAX_LEN];
  8 int status[MAX_LEN][MAX_LEN]; //辅助数组,用来记录每个值是在哪种情况生成的,为后续生成最长公共子序列做准备
  9
 10 /*
 11  *最长公共子序列动态规划方程
 12  *
 13  *m[i][j]代表序列Xi和序列Yi的最长公共自学列的长度
 14  *
 15  *m[i][j] ={
 16  *        0;                           i =0 || j =0;
 17  *        m[i-1][j-1] + 1;               str1[i] = st2[j];
 18  *        max(m[i][j-1], m[i-1][j])        str1[i] != str2[j]
 19  *       }
 20  */
 21
 22 /*两个字符串的最长公共子序列*/
 23 int lcs(char str1[],int str1_len,char str2[],int str2_len)
 24 {
 25     int i,j;
 26     for(i = 1; i < str1_len; i++)
 27     {
 28         for(j = 1; j < str2_len; j++)
 29         {
 30             if(str1[i] == str2[j])
 31             {
 32                 result[i][j] = result[i - 1][j - 1] + 1;
 33                 status[i][j] = 1; //记录为情况1
 34             }
 35             else if(result[i-1][j] >= result[i][j-1])
 36                  {
 37                 result[i][j] = result[i - 1][j];
 38                 status[i][j] = 2; //记录为情况2
 39                  }
 40                  else
 41                  {
 42                      result[i][j] = result[i][j - 1];
 43                 status[i][j] = 3; //记录为情况3
 44                  }
 45         }
 46     }
 47
 48     return result[str1_len - 1][str2_len - 1];
 49 }
 50
 51
 52 /*反转字符串*/
 53 void reverse_str(char str_old[],int str_len,char str_new[])
 54 {
 55     int i,j;
 56
 57     for(i = 0, j = str_len - 1; i < str_len; i++)
 58     {
 59         str_new[i] = str_old[j];
 60         j--;
 61     }
 62 }
 63
 64 /*构造最长公共子序列*/
 65 void lcs_construct(int i,int j,char *str_old)
 66 {
 67     if(i == 0 || j == 0)
 68     {
 69         return;
 70     }
 71
 72     if(status[i][j] == 1)
 73     {
 74         lcs_construct(i - 1,j - 1,str_old);
 75         printf("%c",str_old[i]);
 76     }
 77     else if(status[i][j] == 2)
 78          {
 79         lcs_construct(i - 1,j,str_old);
 80          }
 81          else
 82          {
 83              lcs_construct(i,j - 1,str_old);
 84          }
 85 }
 86
 87 int main()
 88 {
 89     char str_old[MAX_LEN],str_new[MAX_LEN];
 90    int len;
 91     while(scanf("%s",str_old) != EOF)
 92     {
 93         reverse_str(str_old,strlen(str_old),str_new);
 94
 95         len = lcs(str_old,strlen(str_old),str_new,strlen(str_new));
 96
 97         printf("最长公共子序列长度为:%d\n",len);
 98         printf("最长公共子序列为:");
 99         lcs_construct(strlen(str_old) - 1,strlen(str_new) - 1,str_old);
100         printf("\n");
101     }
102 }
时间: 2024-10-12 10:15:14

说一下前天腾讯实习的笔试题--字符串回文问题(动态规划)的相关文章

2015微软实习在线笔试题 - Professor Q&#39;s Software

时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 Professor Q develops a new software. The software consists of N modules which are numbered from 1 to N. The i-th module will be started up by signal Si. If signal Si is generated multiple times, the i-th module

2014华为实习上级笔试题——三天打鱼两天晒网

#include<iostream> using namespace std; int func(int year)//判断闰年的个数 { int count=0; for(int i=1990;i<year;i++) if(year%4==0&&year%100!=0||year%400==0) count++; return count; } int main() { int year,month,day; int count,sum,num; //!!!!!!!!!

2014华为实习上级笔试题-- 统计字符串中出现的单词

#include<iostream> //#include<string> using namespace std; struct node { char word[10]; int num; }; node obj[100]; void my_word(char input[], char output[]) { int sum=0,flag=0; int i=0,j=0,k=0; while(input[i]!='\0')///////////读入单词 { if((input[

阿里巴巴 2016 java 实习岗位笔试题(昨天出炉)

1 Hadoop是当下大数据处理的事实标准之一,具有广泛的应用场景.作为Hadoop生态基础的HDFS分布式文件系统,它具有极高的容错性,适合部署在廉价的机器上,并能提供高吞吐量的数据访问能力,专为大规模数据存取而设计. 请用Java程序来模拟HDFS的三个应用场景:写文件.读文件.Node节点单点故障.场景1为必选,场景2和3可选但必需延续场景1的实现方案.程序请使用JDK原生API来实现. 问题1:请用文字阐述你的设计方案. 问题2:请用Java程序来分别实现你的方案. 2 优惠券是目前较为

腾讯2014实习生笔试题--德梅齐里亚克砝码问题

问题 珠宝商甲需要去鉴定一批41克以下的宝石(可能是41克以下不包括41克的任意重量),他只能携带一个天平和四个砝码去称重,请问他会携带那些重量的砝码?-----2014腾讯暑期实习生附加题第一题 解答: 首先给出问题的答案,聪明的人看到答案的形式就能猜到其中的规律:1,1*2+1=3,(1+3)*2+1=9,(1+3+9)*2+1=27. 德梅齐里亚克砝码问题问题描述: 一位商人有一个40磅的砝码,由于跌落在地而碎成4块.后来,称得每块碎片的重量都是整磅数,而且可以用这4块来称从1至40磅之间

百度实习在线笔试题【逆序问题】

自己写的代码,未经测试 ////baidu实习岗在线测评 ////一组01的二进制字符串,要求不为逆序,需要交换几次位置. // #include <iostream> #include <vector> using namespace std; typedef struct{ unsigned int num; vector<char*> data; }SInput; void pInputData(SInput &input) { int i; cin>

2015腾讯web前端笔试题

  1 请实现,鼠标点击页面中的任意标签,alert该标签的名称.(注意兼容性) 2 请指出一下代码的性能问题,并经行优化. var info="腾讯拍拍网(www.paipai.com)是腾讯旗下知名电子商务网站."; info +="拍拍网于2005年9月12日上线发布,"; info +="2006年3月13日宣布正式运营,"; info +="是目前国内第二大电子商务平台."; info=info.split(&quo

腾讯Online模拟笔试题

选择题部分 1.new和malloc的区别 http://blog.sina.com.cn/s/blog_6fc5bfa90100qgd7.html http://blog.sina.com.cn/s/blog_6fc5bfa90100qgd7.html 2.二路归并排序,选择排序,冒泡排序,插入排序 http://blog.csdn.net/hguisu/article/details/7776068 3.移动平均算法的中间结果用什么数据结构来存储 4.邻接多重表 http://blog.fi

腾讯2016编程笔试题

1.题目如图所示,求出所有满足条件的情况: 这道题的第一思路就是找出隐含关系,然后暴力求解.假设所填空格从上往下,从左往右依次为a,b,c,d,e,f,g,h即: a b 9 c d e f g h 通过找隐含关系可以找到如下关系: a+b=13; 0<=a<=4; 1<=f<=25; e+h=5; 0<=e<=5; 接下来就是暴力求解,代码如下: void main() { int a,b,c,d,e,f,g,h; for (a=0;a<=4;a++) { b=