#include <iostream>
#include <string>
using namespace std;
class Solution {
public:
string longestPalindrome(string s) {
if (s.empty() || s.size() == 1)
return s;
int minStart = 0;
int maxlength = 0;
int i = 0;
//while (i < s.size())
for (; i < s.size();)
{
if (maxlength / 2 >= s.size() - i)
break;
//记录头与尾下标
int pStart = i, pEnd = i;
//跳过所有相同元素,注意到,如果从当前位置开始没有连续相同的元素,则pStart == pEnd;
while (pEnd < s.size()-1 && s[pEnd] == s[pEnd+1])
++pEnd;
//更新 i
i = pEnd + 1;//只能在此更新i的值,而不是用下面的pEnd去更新i的值,因为后面可能还有更长的回文
//扩展回文
while (pStart > 0 && pEnd < s.size()-1 && s[pStart-1] == s[pEnd+1])
{
++pEnd;
--pStart;
}
//计算新的长度
int newLength = pEnd - pStart + 1;
if (newLength > maxlength)
{
maxlength = newLength;
minStart = pStart;
}
}
return s.substr(minStart, maxlength);
}
};
int main()
{
string s("eabcb");
Solution solu;
cout << solu.longestPalindrome(s) << endl;
system("pause");
return 0;
}
最长回文字串的提取
最新推荐文章于 2023-09-01 23:07:01 发布