【面试笔试算法】Problem 9: 腾讯2016年研发实习笔试题:最长回文子串

来源:互联网 发布:钓鱼天气软件哪款好 编辑:程序博客网 时间:2024/05/16 14:16

(一)题目

问题:求给定字符串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,反正大致思想是这样的。

0 0
原创粉丝点击