[2016腾讯暑期实习在线笔试题]最长回文字符串
来源:互联网 发布:安卓麻将游戏源码 编辑:程序博客网 时间:2024/05/19 17:59
问题:求给定字符串s的回文(palindrome)子串中,长度最大的回文子串的长度。
回文(palindrome)是指从左往右读和从右往左读字符串,看到的字符串都是一样的。比如“cabbeaf”,回文子串包括”c”“aba”“abba”等,最长的子串是“abba”,长度为4.
程序输入:“cabbeaf”
回文(palindrome)是指从左往右读和从右往左读字符串,看到的字符串都是一样的。比如“cabbeaf”,回文子串包括”c”“aba”“abba”等,最长的子串是“abba”,长度为4.
程序输入:“cabbeaf”
程序输出:4
这个和之前leetcode中求字符串的最长回文子串还有所不同,,它不要求最终的回文子串相邻。
解题思路:用递归方法的思路是从字符串两头开始找,对于当前头b和当前尾e指定的字符串s[b…e],如果头和尾字符一样s[b]=s[e],那么最大回文子串长度就是s[b+1 … e-1]的最大回文子串长度加上2;如果头和尾字符不一样,那么头和尾各移动一步求回文子串长度,即求s[b+1…e]和s[b…e-1]的回文子串长度,然后s[b…e]的最大回文子串长度就是s[b+1…e]和s[b…e-1]中的最大值。递归结束条件是b>=e,这里有一点注意的就是b>e,则返回0,b=e时按理说应该返回1,因为对于一个字符,本身就可以看作是长度为1的回文。这里根据题目要求来做相应判断就可以了。
另外,为了避免递归做重复的工作,用一个矩阵dp来记录已经求得的部分的回文子串长度,初始dp矩阵的元素都为0,递归程序开始检查dp[b][e]是不是为0,不为0则说明已经找过了,直接返回该值就可以了。
结题代码
class Solution{ //b表示字符串s的begin下标 //e表示end小标 int palLength(string s, int b, int e, vector<vector<int> >&dp) { if (dp[b][e] != 0) return dp[b][e]; if (b > e ) return 0; if (b == e) { dp[b][e] = 1; return 1; } if (s[b] == s[e]){ dp[b][e] = palLength(s, b + 1, e - 1, dp) + 2; } else dp[b][e] = std::max(palLength(s, b + 1, e, dp), palLength(s, b, e - 1, dp)); return dp[b][e]; }public: int findPalindrome(string s){ int n = s.size(); vector<vector<int> > dp(n, vector<int>(n, 0)); return palLength(s, 0, n - 1, dp); }};
0 0
- [2016腾讯暑期实习在线笔试题]最长回文字符串
- [2016腾讯暑期实习在线笔试题]最长回文字符串
- [2016腾讯暑期实习在线笔试题][蛇形矩阵]
- 腾讯2016实习笔试题(最长回文子序列)
- 可删除某些字符的最长回文字符串(2016腾讯在线笔试题)
- 【面试笔试算法】Problem 9: 腾讯2016年研发实习笔试题:最长回文子串
- 2015腾讯暑期实习招聘在线笔试(问答题)
- 2012腾讯暑期实习笔试
- 2013腾讯暑期实习笔试
- 构造回文字符串(最长公共子序列)----腾讯2017暑期实习生编程题
- 腾讯2016暑期实习
- 腾讯2016实习招聘(西安)部分在线笔试题
- 腾讯2016实习生笔试题--求最长回文字符长度
- 腾讯2016实习生笔试题 获得最长回文串长度
- 腾讯暑期实习笔试题-上海-后台开发
- 2014年腾讯暑期实习笔试题(含分析)
- 腾讯17年暑期实习生笔试题 - 构造回文
- 2012.4.14腾讯暑期实习笔试
- linux下搭建svn服务器 (多个项目的权限分组管理)
- Linux SSH命令大全
- 镜像网站
- C#抓取ZigBee串口数据代码
- 成员变量与局部变量的区别
- [2016腾讯暑期实习在线笔试题]最长回文字符串
- 访问权限修饰符
- 什么是Docker
- 简单字符串匹配方法
- 成绩排序问题
- Codeforces Round #341 (Div. 2) C - Wet Shark and Flowers 数学期望
- RxAndroid使用入门记录
- HDU 1257 最少拦截系统
- Android APP开发需要的内容和优秀的开源网站