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