【面试笔试算法】Problem 9: 腾讯2016年研发实习笔试题:最长回文子串
2016-04-12 16:41
477 查看
(一)题目
问题:求给定字符串s的回文(palindrome)子串中,长度最大的回文子串的长度。
回文(palindrome)是指从左往右读和从右往左读字符串,看到的字符串都是一样的。比如“cabbeaf”,回文子串包括”c”“aba”“abba”等,最长的子串是“abba”,长度为4.
程序输入:“cabbeaf”
程序输出:4
(二)解题
当时笔试的时候没有AC,线下在VS上调出来了。此方法的主要思想是:动态规划,利用一个path[i][j]数组记录字符串i到j的最长回文长度,状态转移方程分以下两种情况:
1、如果s[i]==s[j],则回文串长度为path(i+1,j-1)+2;
2、如果s[i]!=s[j],则取max(path(i+1,j),path(i,j-1));
#include <stdio.h> #include <string> #include <iostream> using namespace std; int path[1000][1000] ={0}; int maxlen=0; int findPalindrome(string& s,int start , int end) { if (start > end) return 0; if (start == end) return 1; if (path[start][end] != 0) return path[start][end]; if (s[start] == s[end]) { path[start][end] = findPalindrome(s,start+1,end-1) +2; if (maxlen<path[start][end]) { maxlen = path[start][end]; } } if (s[start] != s[end]) { int temp1 =findPalindrome(s,start+1,end); int temp2 =findPalindrome(s,start,end-1); path[start][end] = temp1>temp2?temp1:temp2; if (maxlen<path[start][end]) { maxlen = path[start][end]; } } return maxlen; } int main (){ string s = "cabbeaf"; findPalindrome(s,0 ,s.length()-1); cout<<maxlen<<endl; return 0; }
没有在OJ平台上测试,也不知道能不能AC,反正大致思想是这样的。
相关文章推荐
- 说一下用浏览器访问www.qq.com的流程(腾讯面试)
- 专业程序员必知的技巧:敲打代码
- Java面试题:栈和队列的实现
- 面试相关
- 在家里发现上不了网怎么办?(腾讯面试)
- 2016年阿里巴巴、腾讯等公司暑期实习面试经验分享
- 亲历面试题
- leetcode之longest palindromic substring
- 折半法查找数组中指定数字的位置并返回
- LeetCode(50)-Word Pattern
- 《程序员面试白皮书》关于链表的问题编程实践
- 10倍效率的程序员的好习惯,你有几个?
- 20140916阿里巴巴面试经历---成都站
- 剑指offer面试题 求从1到n整数中1出现的次数
- 2016年亲身经历的面试题
- 网易面试编程题
- 为什么说写“安装指南”类博客的程序员是懒惰的
- JAVA程序员养成计划之JVM学习笔记(0)-一些注意事项
- 剑指offer面试题 求数组中连续子数组的最大和
- LeetCode(49)-Valid Parentheses