非常弱智的解法:
按照原本的翻转寻找最长公共子串+比对子串在原string和翻转string中的下标(为了防止S的其他部分中存在非回文子串的反向副本)的方法,会卡在“aacdefcaa”上,这是因为不仅S的其他部分中存在非回文子串的反向副本,而且反向子串与原子串的索引也相同。
于是这里把比对下标换成了更为粗暴的暴力验证子串是否回文的做法……
#include<vector>
#include<string>
#include<iostream>
#include<algorithm>
using namespace std;
class Solution {
public:
string longestPalindrome(string s) {
string sReverse=s;
reverse(sReverse.begin(), sReverse.end());
//最长公共子串
//储存字串长度的数组
int* count = new int[s.size()+1];//最前面留一个空位
for (int i = 0; i < s.size(); i++)
count[i] = 0;
//最长字串长度和位置
int maxlen = 0;
int endpos = 0;
//i为s内字符,j为sReverse内字符
for (int i = 0; i < s.size(); i++)
{
for (int j = s.size(); j > 0; j--)
{
if (sReverse[j - 1] == s[i])
{
count[j] = count[j - 1] + 1;
if (count[j] > maxlen)
{ //判断s和sReverse中对应子串下标是否相同
int flag=1;
for (int k = j; j - k > count[j]; k--)
{
if (sReverse[k] != s[s.size() - k])
flag = 0;//出现不相同
}
if (flag)
{
maxlen = count[j];
endpos = j;
//sReverse中的下标+1
}
}
}
else
count[j] = 0;
}
}
string panlidrome=s.substr(s.size()-endpos,maxlen);
return panlidrome;
}
};
int main()
{
string s = "aacdefcaa";
Solution method;
string p = method.longestPalindrome(s);
cout << p << endl;
system("pause");
return 0;
}