题目描述
给你一个字符串,找最大回文子串。
ababa , 答案就是 ababa
abcbc , 答案就是 cbc
回文字符串就是从头读到尾和从尾读到头都是一样的。
分析
我是这样子处理的,把字符串中,从前往后的顺序,定义一个下标pos ,pos从0到size-1。
pos为该子串的头部。然后从后往前面逆序遍历,如果那个字符跟pos处的子串相等,那么开始进入一个函数判断这个字符串是不是回文字符串,如果是记录下来它的大小。如果比上一个大,就记录当前pos位置。
最终调pos和它对应的大小的那个子串,就是最大子串。
时间复杂度n^3。判断是不是回文O(n),一个pos为起始遍历的时间复杂度是O(n^2), 总体遍历就是 n^3。
其实从后往前遍历已经优化了,比从前往后快。
代码
class Solution {
public:
static bool Palindrome( const std::string & str,int begin , int end)
{
int size = str.size();
int left = begin;
int right = end - 1;
while (left<right)
{
if (str[left] != str[right])
return false;
}
return true;
}
static string longestPalindrome(string s)
{
int ret = 1; //至少是1 ,因为如果没有回文字符串,那么就应该返回起始字符
int size = s.size();
int start = 0;
for (int i = 0; i < size-1; ++i)
{
for (int j = size-1; j>i; j--)
{
if (s[i] == s[j])
{
if (Palindrome(s, i, j+1))
{
int temp = j + 1 - i;
if (temp>ret)
{
ret = temp;
start = i;
}
break;
}
}
}
}
return s.substr(start, ret);
}
};