您的位置:首页 > 职场人生

【面试笔试算法】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,反正大致思想是这样的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: