近日参加了一家国内某知名互联网公司的在线笔试,有一道算法题比较有意思,拿出来分享一下。

题目:

给定一个字符串,可以随意删除字符串里的任何字符(也可以不删除),目标是删除一些字符后让剩下的字符能够组成回文,并返回该输入字符串所能构成的最长回文长度。

例如,输入:"eabbfa"。

删除e和f后,构成"abba",因此返回4。

提示:

先看一个递归的方法:

int recursive(string& s, int start, int end) {if (start == end) {return 1;}if (start > end) {return 0;}if (s[start] == s[end]) {return recursive(s, start + 1, end - 1) + 2;}else {return max(recursive(s, start, end - 1), recursive(s, start + 1, end));}
}int longestPalindrom(string s) {return recursive(s, 0, s.length() - 1);
}

但是递归方法会计算许多重复子问题,导致效率下降。

这题可以用动态规划来做。申请一个二维数组,dp[i][j],代表了字符串从 i 到 j 位置的子串中能够包含的最长回文长度。

显然,这里的起始条件是dp[i][i] = 1,i取值为[0, s.length() - 1],因为只有一个字符的字符串一定是回文。

之后可以用 k 代表 i 和 j 的距离,从1开始递增。

当s[i] == s[j]时,进行状态转移,返回dp[i][j] = max(dp[i + 1][j - 1] + 2, max(dp[i + 1][j] + 1, dp[i][j - 1] + 1));

大致思路就是这样。

代码:

int longestPalindrom(string s) {int len = s.length();if (len <= 1) {return len;}vector<vector<int>> dp(len, vector<int>(len, 0));int max_len = 1;// single character is palindromfor (int i = 0; i < len; ++i) {dp[i][i] = 1;}// k is distance between i and jfor (int k = 1; k < len; ++k) {for (int i = 0; i < len - k; ++i) {int j = i + k;if (s[i] == s[j]) {dp[i][j] = max(dp[i + 1][j - 1] + 2, max(dp[i + 1][j] + 1, dp[i][j - 1] + 1));}else {dp[i][j] = max(dp[i + 1][j - 1], max(dp[i + 1][j], dp[i][j - 1]));}}}return dp[0][len-1];
}int main()
{string s = "rdgsaraytbbdrcdfcbsbaaoio";int res = longestPalindrom(s);return 0;
}

如果有更好的思路或者发现代码有纰漏,欢迎留言指正。

转载于:https://www.cnblogs.com/jdneo/p/5351648.html

一道关于回文的笔试题相关推荐

  1. 一道经典的Python数据分析笔试题

    最近无意看到一份关于数据分析的Python笔试题,做起来还是很有意思的,特意自己动手做了一下,和大家分享一下,希望大家也可以跟着练习. 题目如下: 首先,模拟数据: importpandas aspd ...

  2. 一道百度前端线上笔试题

    要求: 输入两个字符串   strA   长度 1-50 只能包含 0或者1   strB   长度 1-5   可以包含 0或1或? (? 代表    0  或者 1) 例如: strA = '10 ...

  3. [小米]2015小米校招之回文数判断

    [题目] 大家对回文串不陌生吧?一个字符串从前看和从后看如果一样的话,就是回文串,比如"上海自来水来自海上"就是一个回文串.现在我们的问题来了,把一个数字看成字符串,问它是不是一个 ...

  4. 去年,蚂蚁一面的一道笔试题,中等难度

    你好,我是 yes. 最近不是跳槽季嘛,今儿我就来分享一道我之前遇到的笔试题(上机写代码,这里统称笔试),这道题遇到的几率还是比较高的. 很多人可能准备去一波阿里或者其他大厂,而这些大厂面试过程一般都 ...

  5. 秋招Android常见笔试题合集--Binrry(冰蕊)

    阅文集团笔试题 单选题 数组初始化 给定如下代码:int x[4]={0};int y[4]={1};数组x和y的值为: {0,0,0,0},{1,0,0,0} 十进制30转换成十六进制数是: 1E ...

  6. 华为牛客网在线笔试题之是否是回文串

    最近投了个华为的简历,然后收到了牛客网的在线笔试,题目有三道,第一道是给定一串字符,找出其中最长的回文串,并返回其长度. 我用C++实现的,思路是遍历字符串的每一个字符,然后设置初始值为1的偏移量,如 ...

  7. 快手腾讯校招笔试题最长回文子序

    腾讯2017 给定一个字符串s,你可以从中删除一些字符,使得剩下的串是一个回文串.如何删除才能使得回文串最长呢? 输出需要删除的字符个数. 输入描述: 输入数据有多组,每组包含一个字符串s,且保证:1 ...

  8. 2019届vivo秋招笔试题【字符串排序】【链表奇数位正序偶数位逆序】【最长回文子串】

    字符串排序 1.题目描述 请对组字符串进行排序,字符串由大小写字母和数字组成,需要满足以下比较规则 1.长度不同时,长度较短在排前面 2.长度相同时,按照字典顺序排列(AaBb-Zz, 0-9顺序), ...

  9. java 正序a~z_2019届vivo秋招笔试题【字符串排序】【链表奇数位正序偶数位逆序】【最长回文子串】...

    字符串排序 1.题目描述 请对组字符串进行排序,字符串由大小写字母和数字组成,需要满足以下比较规则 1.长度不同时,长度较短在排前面 2.长度相同时,按照字典顺序排列(AaBb-Zz, 0-9顺序), ...

最新文章

  1. k3运行linux,首个Kubernetes操作系统k3OS,附主要功能介绍
  2. 光流 | 基于Lukas-Kanade光流法的目标跟踪(附C++代码)
  3. 【收藏】Docker安装微信
  4. Andorid 刷新样式一
  5. poj 2886Who Gets the Most Candies?
  6. linux模拟内存数据落盘,Linux:保证数据安全落盘
  7. weex npm 报错 cb() never called!
  8. C# 关键字 virtual、override和new的用法
  9. vfp生成菜单时文件不存在_如何在VFP项目中创建菜单
  10. python把utf8编码转为gbk_Python:UTF-8编码转换成GBK编码
  11. android 投屏与反控,大屏也能反控手机了,type-c接口的无线投屏器带来的改变
  12. mysql的groupby_MYSQL GROUP BY用法详解
  13. 如何得到满意的好答案
  14. java拼接sql语句的in条件
  15. mysql创建数据库并创建表
  16. 运维(32) Prometheus+Grafana监控SpringBoot
  17. 32位汇编语言学习笔记(45)--测试简单文件操作接口(完)
  18. 电子商务交易系统的设计与实现(javaee+mysql)
  19. 我太南了、996、保温杯里泡枸杞等成为2019年职场关键词
  20. AJAX实例--根据邮政编号动态获取省,市,县三级地区+仿百度搜索下拉提示

热门文章

  1. 总结一下嵌入式OLED显示屏显示中文汉字的办法
  2. 【转】Android Studio系列教程一--下载与安装
  3. 利用命令清除和设定静态IP地址
  4. 转:开火,移动-大神Joel 也浮躁
  5. C++ socket编程
  6. 使用 C# 开发智能手机软件:推箱子(二十)
  7. NIO网络编程实战之简单多人聊天室
  8. 篝火怎么做_上世纪的“Dyatlov事件”到底是怎么一回事儿,真是未知力量吗?...
  9. 机器学习知识点(十)马尔可夫链
  10. 关于eclipse 中文注释时中文字体太小的问题解决