求解回文字符串:这道题是查找资料才得到的解法。具体思路如下:比如对字符串abcba,做如下处理#a#b#c#b#a#,目的是消除偶数的回文。计算一点的回文长度时,根据保存的前端的最大回文长度和中心点,判断当前点应该是从0开始计算,还是可以根据利用以前的结果。主要就是这个思路。
class Solution {
public:
string result;
int maxpoint;
int maxlen;
vector<int> buf;
string longestPalindrome(string s) {
if(s.empty())
return s;
string temp;
temp = Init(s);
buf.resize(temp.size());
maxpoint = 0;
maxlen =0;
int len =0;
for(int i=0; i<temp.size(); i++)
{
len = Getlen(temp,i);
buf[i] = len;
if(len >= maxlen)
{
maxlen = len;
maxpoint = i;
}
}
for(int i = maxpoint - (maxlen - 1); i<= maxpoint + maxlen -1; i++)
{
if(temp[i] == ‘#‘)
continue;
result.push_back(temp[i]);
}
return result;
}
int Getlen(string& pattern,int mid)
{
int left=0, right =0;
int index =1;
if(maxpoint + maxlen > mid)
{
if(buf[2*maxpoint - mid] + mid - maxpoint > maxlen)
{
index = maxlen - (mid - maxpoint);
}
else
{
index = buf[2*maxpoint - mid];
}
}
while(1)
{
if(mid - index<0)
break;
if(mid + index>= pattern.size())
break;
if(pattern[mid-index] != pattern[mid + index])
break;
index++;
}
return index;
}
string Init(string& s)
{
string temp;
bool flag = false;
temp.push_back(‘#‘);
for(int i=0; i<s.size(); )
{
if(flag == false)
{
temp.push_back(s[i]);
flag = true;
i++;
}
else
{
temp.push_back(‘#‘);
flag = false;
}
}
if(flag == true)
{
temp.push_back(‘#‘);
}
return temp;
}
};
原文:http://www.cnblogs.com/xgcode/p/4265419.html